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: 我完全是编译器的初学者
这里有几个问题:
- 链接器仅使用存档中的目标文件来解析未解析的符号。这就是为什么命令行中的归档顺序很重要。正确的顺序是目标文件,然后是静态库,然后是共享库。例如。
g++ -o main -pthread main.cpp -L. -lsomeLib -lpcrecpp -lpcre
.
- 当您构建共享库时,存档不会解析任何符号,因此链接器会完全忽略它。见 1.
- 共享库的目标文件必须编译为与位置无关的代码(
-fPIC
编译器标志)。存档通常在没有此标志的情况下构建。
- 在编译和链接多线程应用程序时使用
-pthread
标志,而不是 -lpthread
。
我有一个 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: 我完全是编译器的初学者
这里有几个问题:
- 链接器仅使用存档中的目标文件来解析未解析的符号。这就是为什么命令行中的归档顺序很重要。正确的顺序是目标文件,然后是静态库,然后是共享库。例如。
g++ -o main -pthread main.cpp -L. -lsomeLib -lpcrecpp -lpcre
. - 当您构建共享库时,存档不会解析任何符号,因此链接器会完全忽略它。见 1.
- 共享库的目标文件必须编译为与位置无关的代码(
-fPIC
编译器标志)。存档通常在没有此标志的情况下构建。 - 在编译和链接多线程应用程序时使用
-pthread
标志,而不是-lpthread
。