1

我有一个静态库matrixlib.a,我用它来编译一些C代码。这段代码是用编译的gcc,它工作正常。但是,我想将此库引入C++代码中,然后问题就开始了。我编译C代码的方式:

gcc -I/matrix/include -O -Wall example.c -c -o example.o
gfortran example.o /matrix/lib/matrixlib.a -lblas -fopenmp -o example_c

如果现在我们换成gccg++

example.c:(.text+0xf5): undefined reference to `mygemm_solver(int, double const*, double*, double*, int, int)'

mygemm_solver我正在使用example.c文件的功能。关于我做错了什么的任何想法?

4

1 回答 1

8

中的函数example.c可能未声明extern "C",因此 C++ 编译器正在对生成的符号名称应用名称修饰。Fortran 代码可能不使用损坏的名称,因此当链接器尝试定位它时,找不到符号。

第一步是将要从 C/C++ 代码“导出”的所有函数的原型放入头文件中。把它放在顶部:

#ifdef __cplusplus
extern "C" {
#endif

然后在底部:

#ifdef __cplusplus
}
#endif

这具有自动应用于extern "C"头文件中声明的所有函数的效果,但仅当您编译为 C++ 时。

但是,重要的是要注意 C 和 C++ 是具有不同语义的不同语言(例如,关于隐式转换 from void *)。您应该使用 C 编译器编译 C 代码,使用 C++ 编译器编译 C++ 代码。在技​​术上可以编写同时是有效的 C 和 C++ 的代码,并且在两种语言中具有相同的语义,但很少有理由这样做。

于 2013-09-30T15:31:28.163 回答