从不同的VS2010项目中的C代码调用C函数时链接器错误

从不同的VS2010项目中的C代码调用C函数时链接器错误,第1张

概述我正在尝试包含我在C项目中找到的一些C代码.该函数在C文件中定义如下. #ifdef __cplusplusextern "C" {#endif extern char *dtoa(double, int, int, int *, int *, char **); extern char *g_fmt(char *, double); extern void freedtoa(char* 我正在尝试包含我在C项目中找到的一些C代码.该函数在C文件中定义如下.

#ifdef __cplusplusextern "C" {#endif extern char *dtoa(double,int,int *,char **); extern char *g_fmt(char *,double); extern voID freedtoa(char*);#ifdef __cplusplus    }#endif char *g_fmt(register char *b,double x){

我在其中包含的VS项目正在创建一个dll.该文件正在编译为C,项目中的其他文件正在编译为C.

我添加了一个标题以包含在我的C文件中

#ifndef G_FMT_H#define G_FMT_H#ifdef __cplusplusextern "C" {#endif extern char *dtoa(double,double); extern voID freedtoa(char*);#ifdef __cplusplus}#endif#endif //G_FMT_H

在解决方案的另一个项目中,我包含我的标题并尝试调用g_fmt函数.

#include "header.h"...g_fmt(my_array,2.0);

这个项目链接到另一个项目,我可以在第一个库中调用C函数而不会出现任何问题.但是,添加上面的行会给我一个lnk2001错误.

error LNK2001: unresolved external symbol g_fmt

我发现了一些关于混合C和C的其他问题,我似乎已经在正确的位置使用extern关键字做了所有必要的事情,但是我仍然无法链接.在VS2010中我需要做些什么吗?

解决方法 在C或C中,考虑到模块可能由多个对象组成,每个对象都应该清楚地分隔.此外,每个对象(.c或.cpp文件)都应该有自己的头文件.因此,您应该有一个头文件和一个c(xx)文件用于C函数(在您的示例中为3).另外,作为一般准则,在命名文件和宏时尝试保持一致:header.h文件使用G_FMT_H宏作为包含保护.因此,尝试将.h和.c文件重新组织为:

functions.h:

#pragma once#if defined (WIN32)#if defined(FUNCTIONS_STATIC)#define FUNCTIONS_API#else#if defined(FUNCTIONS_EXPORTS)#define FUNCTIONS_API __declspec(dllexport)#else#define FUNCTIONS_API __declspec(dllimport)#endif#endif#else#define FUNCTIONS_API#endif#if defined(__cplusplus)extern "C" {#endif    FUNCTIONS_API char *dtoa(double,char **);    FUNCTIONS_API char *g_fmt(char *,double);    FUNCTIONS_API voID freedtoa(char*);#if defined(__cplusplus)}#endif

和相应的实现(functions.c):

#define FUNCTIONS_EXPORTS#include "functions.h"char *dtoa(double,char **) {    //function statements}char *g_fmt(char *,double) {    //function statements}voID freedtoa(char*) {    //function statements}

头文件中需要注意的两件事(除了重新组织和重命名):

>每个函数的extern存储说明符都消失了
>导出逻辑:你的项目现在将定义FUNCTIONS_EXPORT(来自functions.c,或者希望是一个VStudio项目设置 – 无论如何,在#include之前的某个地方“functions.h”)

>当编译此项目(functions.c)时,将导出函数(由于宏定义)
>当头文件将包含在另一个项目中(未定义FUNCTIONS_EXPORTS)时,函数将被标记为已导入,链接器将在导入的.lib中搜索它们 – 其中一个应该是这个项目产生的一个
>为了更严格,您可以通过VStudio IDE自动定义的宏替换FUNCTIONS_EXPORTS(并从functions.c中删除其定义):${YOUR_PROJECT_name} _EXPORTS(例如,如果您的Dll项目名为ExportFunctionsproject.vc(x) proj,然后宏名称将是EXPORTFUNCTIOnsprOJECT_EXPORTS)
>您可以在VStudio(2010)IDE中检查宏名称:项目属性 – > C/C++ – >预处理器 – >预处理器定义.有关更多详细信息,请查看[MS.Docs]: /D (Preprocessor Definitions)

类似(或相关)问题:

> [SO]: Excel VBA,Can’t Find DLL Entry Point from a DLL file (@CristiFati’s answer)
> [SO]: LNK2005 Error in CLR Windows Form (@CristiFati’s answer)

EDIT0:为静态构建添加了“支持”.编辑1:跨平台一些更正.

总结

以上是内存溢出为你收集整理的从不同的VS2010项目中的C代码调用C函数时链接器错误全部内容,希望文章能够帮你解决从不同的VS2010项目中的C代码调用C函数时链接器错误所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/langs/1209826.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-04
下一篇 2022-06-04

发表评论

登录后才能评论

评论列表(0条)

保存