我创建了一个dll文件。该文件编译为C代码。我想在一个新项目中使用这个dll文件。这个新项目是一个C ++项目。如果我编译我的新项目,一切都很好但是当项目编译为C ++程序时,它为从dll文件导出的函数提供了未解决的外部符号错误。我希望我的新项目是一个C ++程序,但想要链接一个编译为C程序的库。我正在使用Visual Studio 2010.有什么帮助吗?
答案 0 :(得分:9)
另一种方法是更改C头文件以检查是否正在由cpp编译器编译并有条件地包含extern“C”:
#ifdef __cplusplus
extern "C" {
#endif
void func1(int a, int b);
//... other functions
#ifdef __cplusplus
}
#endif
答案 1 :(得分:7)
您需要在导入过程的头文件声明中使用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 ++,它需要有条件地包括在内
答案 2 :(得分:5)
将C标头添加到C ++项目时执行此操作:
extern "C"
{
#include "cheader.h" //C header
}
这可以防止C ++编译器对cheader.h
您甚至可以将命名空间定义为:
namespace cproject
{
extern "C"
{
#include "cheader.h" //C header
}
}
如果您这样做,那么当您引用cproject::
中定义的名称时,您必须使用cheader.h
限定每个名称(函数,变量和结构)。