与 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 链接的主要内容,如果未能解决你的问题,请参考以下文章

配置编译器(GCC和GFortran)

使用 GCC 和 GFORTRAN 进行矢量化

CMake:将Fortran与静态C库链接失败

Mac OS X 10.8.3 上的 gfortran/gcc4.8

CMake c++ 库链接

Centos切换界面和安装fortran