将C库与C ++链接

时间:2011-04-18 18:53:39

标签: c++ c dll

我创建了一个dll文件。该文件编译为C代码。我想在一个新项目中使用这个dll文件。这个新项目是一个C ++项目。如果我编译我的新项目,一切都很好但是当项目编译为C ++程序时,它为从dll文件导出的函数提供了未解决的外部符号错误。我希望我的新项目是一个C ++程序,但想要链接一个编译为C程序的库。我正在使用Visual Studio 2010.有什么帮助吗?

3 个答案:

答案 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

中定义的名称执行name-mangling

您甚至可以将命名空间定义为:

namespace cproject
{
    extern "C"
    {
       #include "cheader.h" //C header 
    }    
}

如果您这样做,那么当您引用cproject::中定义的名称时,您必须使用cheader.h限定每个名称(函数,变量和结构)。