从不同的VS2010项目中的C代码调用C函数时链接器错误
我正在尝试包含我在C项目中找到的一些C代码.该函数在C文件中定义如下.
#ifdef __cplusplus extern "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 __cplusplus extern "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.c)时,将导出函数(由于宏定义) 类似(或相关)问题: > [SO]: Excel VBA,Can’t Find DLL Entry Point from a DLL file (@CristiFati’s answer) EDIT0:为静态构建添加了“支持”.编辑1:跨平台一些更正. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |