将C库与C++链接

del*_*unt 3 c c++ dll

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

bcs*_*hes 9

另一个方法是更改​​C头文件以检查是否正在由cpp编译器编译并有条件地包含extern"C":

#ifdef __cplusplus 
extern "C" {
#endif

void func1(int a, int b);
//... other functions

#ifdef __cplusplus
}
#endif
Run Code Online (Sandbox Code Playgroud)


Dav*_*nan 7

您需要extern "C"在头文件中使用导入过程的声明,以便使用C链接.

目前正在发生的事情是C++编译器期望导入函数的名称损坏.使用extern "C"关闭C++名称修改的开关.

例如:

extern "C"
{
    int Func1(int a, int b);
    void Func2(double a);
}
Run Code Online (Sandbox Code Playgroud)

由于您可以控制头文件,因此将它放在头文件中会更有意义extern "C".这意味着任何使用头文件的人都不需要关心这些问题.但是,当包含您无法控制的头文件时,@ Nawaz的建议是一种灵活的方式.

我也忘了提到@bcsanches提出的优点extern "C"是C++而不是C.因此,如果你想要一个头文件同时适用于C和C++,它需要有条件地包括在内.


Naw*_*waz 5

将C头添加到C++项目时执行此操作:

extern "C"
{
   #include "cheader.h" //C header 
}
Run Code Online (Sandbox Code Playgroud)

这可以防止C++编译器对定义的名称进行名称修改cheader.h

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

namespace cproject
{
    extern "C"
    {
       #include "cheader.h" //C header 
    }    
}
Run Code Online (Sandbox Code Playgroud)

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