与 gcc、g++ 和 gfortran 链接
Posted
技术标签:
【中文标题】与 gcc、g++ 和 gfortran 链接【英文标题】:Linking with gcc, g++ and gfortran 【发布时间】:2013-09-30 15:26:54 【问题描述】:我有一个静态库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, double const*, double*, double*, int, int)'
作为 mygemm_solver
我正在使用的函数 example.c
文件。关于我做错了什么的任何想法?
【问题讨论】:
你需要把c编译成c,C++编译成C++ 【参考方案1】: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++ 的代码,并且在两种语言中具有相同的语义,但很少有这样做的理由。
【讨论】:
@_cdhowie 你是对的,它没有声明extern "C"
。如果我编辑标题会起作用吗?
@Manolete 如果此标头包含在example.c
中,那么它可能会。 C++ 编译器需要看到这一点,以便它生成的符号不会被破坏。以上是关于与 gcc、g++ 和 gfortran 链接的主要内容,如果未能解决你的问题,请参考以下文章