链接gcc,g ++和gfortran

时间:2013-09-30 15:26:54

标签: c++ gcc g++ fortran gfortran

我有一个静态库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文件的函数。对我做错了什么想法?

1 个答案:

答案 0 :(得分:8)

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 ++代码,并且在两种语言中都有相同的语义,但很少有理由这样做。