我有一个库文件(.lib),其中有许多功能。我正在尝试从中构建一个共享对象。但库中的符号中没有符号存在于库中的共享对象中。但是,当我从同一个库中生成可执行文件时,符号是可见的。
图书馆有问题吗? 我是否需要以适合创建共享对象的格式编译库?
答案 0 :(得分:1)
链接器的作用是仅从解析未解析符号的存档.o
中提取.a
个文件。
链接共享库并仅将.a
文件传递给链接器时,没有未解析的符号,因此.a
中的任何目标文件都不会被拉入共享库。
要链接共享库,必须将目标文件编译为与位置无关的代码(-fPIC
,.o
.a
文件通常在没有此选项的情况下构建)然后链接到共享图书馆。不需要.a
个文件。
另一个选择是链接.a
文件时使用.a
链接器选项显式取消定义-Wl,--undefined=<symbol>
中存在的符号。但是这不能很好地扩展,因为它需要提到包含.o
的每个.a
中的至少一个符号(假设链接器引入整个.o
,而不是仅仅引入一个符号)。