C++ 与gcc、g和x2B链接+;还有格弗特兰

C++ 与gcc、g和x2B链接+;还有格弗特兰,c++,gcc,g++,fortran,gfortran,C++,Gcc,G++,Fortran,Gfortran,我有一个静态库matrixlib.a,我用它来编译一些C代码。这段代码是用gcc编译的,运行良好。然而,我想将这个库引入C++代码,然后问题就开始了。 我编译C代码的方式: gcc-I/matrix/include-O-Wall示例。c-c-O示例。O gfortran example.o/matrix/lib/matrixlib.a-lblas-fopenmp-o example\u c 如果现在我们用gcc交换g++: 示例c:(.text+0xf5):对“mygemm_解算器(int)”的

我有一个静态库
matrixlib.a
,我用它来编译一些
C
代码。这段代码是用
gcc
编译的,运行良好。然而,我想将这个库引入
C++
代码,然后问题就开始了。 我编译
C
代码的方式:

gcc-I/matrix/include-O-Wall示例。c-c-O示例。O
gfortran example.o/matrix/lib/matrixlib.a-lblas-fopenmp-o example\u c

如果现在我们用
gcc
交换
g++

示例c:(.text+0xf5):对“mygemm_解算器(int)”的未定义引用, 双常量*,双*,双*,整数,整数)'


作为
mygemm\u solver
我正在使用的函数
example.c
文件。关于我做错什么的想法?

< p>在代码>实例中。C < /> >可能没有声明为代码>外“C”< />代码,因此C++编译器正在对生成的符号名称应用名称修改。Fortran代码可能不使用损坏的名称,因此当链接器尝试查找它时,无法找到符号

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

#ifdef __cplusplus
extern "C" {
#endif
下面是这个:

#ifdef __cplusplus
}
#endif
<>这有自动将 Extn(c)< /C> >应用到标题中声明的所有函数,但只有当您编译为C++ +

时才生效。
但是,重要的是要注意C和C++是不同的语义不同的语言(例如,关于从<代码>空隙*<代码>的隐式转换)。你应该用C编译器编译C代码,C++代码编译C++编译器。在技术上,可以编写既有效C又C++的代码,这两种语言都有相同的语义,但很少有理由这样做。

< P> <代码>实例.c>代码>中的函数可能没有声明为代码>外“C”< /C> >,因此C++编译器正在将名称修饰应用到生成的符号名称。Fortran代码可能不使用损坏的名称,因此当链接器尝试查找它时,无法找到符号

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

#ifdef __cplusplus
extern "C" {
#endif
下面是这个:

#ifdef __cplusplus
}
#endif
<>这有自动将 Extn(c)< /C> >应用到标题中声明的所有函数,但只有当您编译为C++ +

时才生效。
但是,重要的是要注意C和C++是不同的语义不同的语言(例如,关于从<代码>空隙*<代码>的隐式转换)。你应该用C编译器编译C代码,C++代码编译C++编译器。在C++中C++ C++和C++语言都是技术上可行的,在两种语言中都有相同的语义,但是很少有理由这样做。

你需要编译C作为C,C++作为C ++,你需要编译C作为C,C++作为C++ +@ CDHOWIE你是对的,它不是声明<代码>外“C”< /C>。如果我编辑标题,它会工作吗?@Manolete如果此标题包含在
example.c
中,那么它可能会工作。C++编译器需要看到它,这样它产生的符号就不会被损坏。@,你是正确的,它不是声明<代码>外“C”< /代码>。如果我编辑标题,它会工作吗?@Manolete如果此标题包含在
example.c
中,那么它可能会工作。C++编译器需要看到这个,这样它产生的符号就不会被损坏。