无法将 C 共享对象链接到C++程序
Can't link a C shared object to a C++ program
我正在尝试为项目编写一个制作文件。该项目涉及一个测试程序,该程序定义了一个用 C++11 编写的主函数,该函数应该调用用 c99 编写的共享对象库并运行一些测试。
我的生成文件成功编译了 c99 库并生成"libhanoi.so"。
当我尝试将 C99 库链接到 C++11 部件时,出现以下错误:
g++ -std=gnu++11 -L. -lhanoi -o main tests/testing.cpp tests/main.cpp
/tmp/cctHQTcW.o: In function `binarion_constructor(unsigned long*)':
main.cpp:(.text+0x28): undefined reference to `binarion64_t'
collect2: error: ld returned 1 exit status
Makefile:29: recipe for target 'tests' failed
make: *** [tests] Error 1
但是,"nm -C libhanoi.so"的输出显示binarion64_t函数正在导出 libhanoi.so:
0000000000000610 T binarion64_t(long long, long long)
当我在 libhanoi.so 的名称中引入拼写错误时,它会引入一个错误,说它找不到 libhanoi.so。
因此,它必须能够找到 libhanoi.so 并且 libhanoi.so 正在导出main.cpp中未实现的函数,但它仍然给出了未定义的引用。这是怎么回事?
最小示例:
河内:
#ifndef HANOI_H
#define HANOI_H
#include <inttypes.h>
// binarion (base -1+i) constructor
uint64_t binarion64_t(long long A, long long B);
#endif // HANOI_H
binarion.c:
#include "hanoi.h"
uint64_t binarion64_t(long long A,long long B){
return 0;
}
主.cpp:
#include <stdio.h>
extern "C" {
#include "hanoi.h"
};
uint64_t binarion_constructor(uint64_t * args){
return binarion64_t(args[0], args[1]);
}
int main(void){
return 0;
}
编译:
g++ -std=c99 -c binarion.c
g++ -std=c99 -shared -o libhanoi.so binarion.o -lm
g++ -std=gnu++11 -L. -lhanoi -o main main.cpp
输出:
/tmp/ccjoRmCg.o: In function `binarion_constructor(unsigned long*)':
main.cpp:(.text+0x28): undefined reference to `binarion64_t'
collect2: error: ld returned 1 exit status
编辑:
我正在运行的命令是:
gcc -std=c99 -c binarion.c
gcc -std=c99 -shared -o libhanoi.so binarion.o -lm
g++ -std=gnu++11 -L. -lhanoi -o main main.cpp
这些文件正是问题中的文件。"readelf -s libhanoi.so |grep binarion"是:
12: 0000000000000660 19 FUNC GLOBAL DEFAULT 11 binarion64_t
33: 0000000000000000 0 FILE LOCAL DEFAULT ABS binarion.c
46: 0000000000000660 19 FUNC GLOBAL DEFAULT 11 binarion64_t
而 "g++ -std=gnu++11 -L. -lhanoi -o main main.cpp" 的输出为:
/tmp/cczfgY8M.o: In function `binarion_constructor(unsigned long*)':
main.cpp:(.text+0x28): undefined reference to `binarion64_t'
collect2: error: ld returned 1 exit status
TL;博士:
用:
gcc -std=c99 -c binarion.c
gcc -std=c99 -shared -o libhanoi.so binarion.o -lm
g++ -std=gnu++11 -L. -lhanoi -o main main.cpp
解释:
您应该使用gcc
来编译 C 文件,g++
用于C++。当您执行g++ -std=c99 -c binarion.c
时,编译器会为您提供以下提示:
cc1plus: warning: command line option ‘-std=c99’ is valid for C/ObjC but not for C++
这意味着您最终会将库编译为C++库。您可以通过调用readelf -s libhanoi.so | grep binarion
来验证这一点:
9: 00000000000005da 19 FUNC GLOBAL DEFAULT 9 _Z12binarion64_txx
29: 0000000000000000 0 FILE LOCAL DEFAULT ABS binarion.c
44: 00000000000005da 19 FUNC GLOBAL DEFAULT 9 _Z12binarion64_txx
如您所见,该函数已被名称破坏,这是C++做的事情,而 C 没有。
但是,在编译main.cpp
时,您告诉编译器binarion_t
具有 C 链接:
extern "C" {
#include "hanoi.h"
};
所以它正在寻找未损坏的binarion_t
(而不是_Z12binarion64_txx
)。
- lambda参数转换为constexpr技巧,然后获取带链接的数组
- CMake-按正确顺序将项目与C运行时对象文件链接
- 从链接列表c++中删除一个项目
- 有根的二进制搜索树.保留与其父级的链接
- 读取文件的最后一行并输入到链接列表时出错
- 静态数据成员的问题-修复链接错误会导致编译器错误
- node-gyp 在 macOS 上未正确链接库
- 基于boost的程序的静态链接——zlib问题
- 无法链接 CMake 中的本地库
- 内联函数中具有内部链接的全局变量
- 链接阶段在Ubuntu上失败,但在MacOS上失败
- 使用gcc从静态链接的文件中查找可选符号
- 我可以将一个用clang c++11编译的对象与另一个用c++17编译的对象链接起来吗
- 将--whole archive链接器选项与CMake和具有其他库依赖项的库一起使用
- 下面是我为检测链接列表中的循环而制作的代码
- 有了gcc,是否可以链接库,但前提是它存在
- 使用C链接在函数内部创建C++模板
- Visual Studio mkl_link_tool.exe链接错误
- 尝试链接我的着色器时,我收到错误代码"error c5145 must write to gl_position"
- 有人能帮我处理这个链接列表吗?C++