g++ link 一个 .a 文件和它的依赖到一个静态的 .so

g++ link an .a file and its dependencies into a static .so

我有一个 libSomelib.a 可以通过以下命令 link 编辑为可执行文件:

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

但是我怎么能 link 一个包含所有依赖关系的共享对象呢?

我想用我的新 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