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

时间:2016-11-18 17:47:10

标签: 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 个答案:

答案 0 :(得分:1)

这里有一些问题:

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