我创建了一个dll文件。这个文件是编译成C代码的。我想在一个新项目中使用这个dll文件。这个新项目是一个C++项目。如果我编译我的新项目,一切都很好,但当项目编译为C++程序时,由于从dll文件中导出的函数未解析而出现无法解决的外部符号错误。我希望我的新项目是一个C++程序,但想要链接一个以C程序编译的库。我正在使用Visual Studio 2010。有没有帮助?
另一种方法是更改C头文件,检查是否由cpp编译器编译,并有条件地包含extern "C":
#ifdef __cplusplus
extern "C" {
#endif
void func1(int a, int b);
//... other functions
#ifdef __cplusplus
}
#endif
您需要在导入的过程的头文件声明中使用extern "C"
,以便使用 C 连接。
目前发生的情况是 C++ 编译器期望使用变形后的名称作为导入函数的名称。使用 extern "C"
可以关闭 C++ 的名称变形。
例如:
extern "C"
{
int Func1(int a, int b);
void Func2(double a);
}
extern "C" 放置在头文件中更有意义。这意味着使用您的头文件的任何人都不需要关注此类问题。但是,当包含您无法控制的头文件时,@Nawaz的建议是一种巧妙的方法。
我还忘记提到@bcsanches所做的优秀观点,即 extern "C" 是C ++而不是C。因此,如果要使单个头文件适用于C和C ++,则需要有条件地包含它。
在将C头文件添加到C++项目时,请执行以下操作:
extern "C"
{
#include "cheader.h" //C header
}
这可以防止C++编译器对cheader.h
中定义的名称进行名称重整
你甚至可以定义一个命名空间,如下:
namespace cproject
{
extern "C"
{
#include "cheader.h" //C header
}
}
cheader.h
中定义的名称时,您必须使用cproject::
限定每个名称(函数、变量、结构体)。