linux - g++ 将 .a 文件及其依赖项链接到静态 .so

标签 linux linker g++ portability static-linking

我有一个 libSomelib.a,可以通过以下命令链接到可执行文件:

g++ -L. -lsomeLib -lpcrecpp -lpcre -lpthread main.cpp -o main

但是我如何从中链接一个包含所有依赖项的共享对象?

我想用我的新 someLib.so 实现以下目标:

g++ -L. -lsomeLib main.cpp -o main

我尝试过以下方法:

g++ -shared -L. -lsomeLib -lpcrecpp -lpcre -lpthread -o libSomelib_static.so

这给了我一个没有符号的 .so 文件。

PS:我完全是编译器的初学者。

最佳答案

这里存在一些问题:

  1. 链接器仅使用存档中的目标文件来解析未解析的符号。这就是为什么命令行中的存档顺序很重要。正确的顺序是目标文件,然后是静态库,然后是共享库。例如。 g++ -o main -pthread main.cpp -L. -lsomeLib -lpcrecpp -lpcre .
  2. 当您构建共享库时,存档不会解析任何符号,因此链接器完全忽略它。参见1。
  3. 共享库的目标文件必须编译为位置独立代码(-fPIC编译器标志)。归档文件通常是在没有此标志的情况下构建的。
  4. 使用-pthread在编译和链接多线程应用程序时标记两者,而不是 -lpthread .

关于linux - g++ 将 .a 文件及其依赖项链接到静态 .so,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40683113/

相关文章:

linux - 使用 CMake 创建二进制文件会删除运行时路径

c - 将共享库链接到静态库 : must the static library be compiled differently than if an application were linking it?

c++ - C++结构中的运行时大小的数组

用于 sudo 和 apache 的 linux umask

c++ - 通过静态库进行条件链接

linux - : `if ls/etc/*release 1>/dev/null 2>&1` work? 请解释一下

c++ - libc++abi.dylib : terminate called throwing an exception Abort trap: 6

c++ - 将应用程序链接到 libbz2.so.1 而不是 libbz2.so.1.0

C — 使用 chdir() 函数

linux - AWK 处理数据直到下一次匹配