与 gcc、g++ 和 gfortran 链接

Linking with gcc, g++ and gfortran

本文关键字:gfortran 链接 g++ gcc      更新时间:2023-10-16

我有一个静态库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

如果现在我们将gcc换成g++

example.c:(.text+0xf5(:对'mygemm_solver(int, 双常量*, 双*, 双*, 整数, 国际('

mygemm_solver我正在使用example.c文件的功能。对我做错了什么有什么想法吗?

example.c中的函数可能没有声明extern "C",因此C++编译器对生成的符号名称应用名称重整。 Fortran 代码可能不使用损坏的名称,因此当链接器尝试查找它时,找不到符号。

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

#ifdef __cplusplus
extern "C" {
#endif

然后在底部:

#ifdef __cplusplus
}
#endif

这具有自动将extern "C"应用于标头中声明的所有函数的效果,但仅在C++编译时。

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