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