gpt4 book ai didi

c++ - 与 gcc、g++ 和 gfortran 链接

转载 作者:太空宇宙 更新时间:2023-11-03 10:30:09 25 4
gpt4 key购买 nike

我有一个静态库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): undefined reference to `mygemm_solver(int, double const*, double*, double*, int, int)'

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

最佳答案

example.c 中的函数可能未声明为 extern "C",因此 C++ 编译器正在对生成的符号名称应用名称修饰。 Fortran 代码可能不使用损坏的名称,因此当链接器尝试定位它时找不到该符号。

第一步是将要从 C/C++ 代码“导出”的所有函数的原型(prototype)放入头文件中。将其放在顶部:

#ifdef __cplusplus
extern "C" {
#endif

然后在底部:

#ifdef __cplusplus
}
#endif

这具有将 extern "C" 自动应用于 header 中声明的所有函数的效果,但仅当您作为 C++ 进行编译时才如此。

但是,请务必注意,C 和 C++ 是具有不同语义的不同语言(例如,关于从 void * 隐式转换)。您应该使用 C 编译器编译 C 代码,使用 C++ 编译器编译 C++ 代码。编写同时适用于 C 和 C++ 且在两种语言中具有相同语义的代码在技术上是可能的,但很少有理由这样做。

关于c++ - 与 gcc、g++ 和 gfortran 链接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19098058/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com