为什么 boost 构建不喜欢静态库?



我正在使用boost.build。在其中一个步骤中"g++" -o "testbed/bin/gcc-5.3.0/debug/link-static/get_tag34_tag34_processed" -Wl,--start-group "testbed/bin/gcc-5.3.0/debug/link-static/get_tag34_tag34_processed.o" "/usr/local/lib64/librabbitmq.a" "/usr/lib64/libmysqlcppconn-static.a" "/apps/boost/root/bin.v2/libs/date_time/build/gcc-5.3.0/debug/link-static/libboost_date_time.a" -Wl,-Bstatic -lz -lbz2 -Wl,-Bdynamic -Wl,--end-group -g -lSimpleAmqpClient -lcrypto -ldl -lmysqlcppconn -lpthread -lrdkafka -lrdkafka++ -lssl我正在尝试链接到卡夫卡库。在系统目录中有 .so 和 .a /usr/lib/gcc/x86_64-linux-gnu/5/../../../x86_64-linux-gnu/librdkafka++.so/usr/lib/gcc/x86_64-linux-gnu/5/../../../x86_64-linux-gnu/librdkafka++.a .但是,它更喜欢 .so。我该如何解决这个问题?

对 .a 文件使用完整路径。所以而不是

-lrdkafka

"/usr/lib/gcc/x86_64-linux-gnu/5/../../../x86_64-linux-gnu/librdkafka++.a"

(注意缺少"-l")

或者,删除 .so. :)

这不是 boost.build 行为,这就是 gcc 和 ld 的工作方式:

-l 名称规范 --库=名称规范

将 namespec 指定的归档文件或对象文件添加到要链接的文件列表中。此选项可以使用任意次数。如果 namespec 的形式为 :filename,ld 将在库路径中搜索一个名为 filename 的文件,否则它将在库路径中搜索一个名为 libnamespec.a 的文件。 在支持共享库的系统上,ld 还可以搜索 libnamespec.a 以外的文件。具体来说,在ELF和SunOS系统上,ld将在目录中搜索一个名为 libnamespec.so 的库,然后再搜索一个名为libnamespec.a的库。(按照惯例,".so"扩展名表示共享库。请注意,此行为不适用于 :filename,它始终指定一个名为 filename 的文件。

链接器只会在命令行上指定存档的位置搜索存档一次。如果存档在命令行上定义的某个对象中未定义的符号出现在存档之前,则链接器将包含存档中的相应文件。但是,稍后在命令行上出现的对象中的未定义符号不会导致链接器再次搜索存档。

有关强制链接器多次搜索存档的方法,请参阅 -( 选项。

您可以在命令行上多次列出相同的存档。

这种类型的存档搜索是 Unix 链接器的标准配置。但是,如果在 AIX 上使用 ld,请注意它与 AIX 链接器的行为不同。

最新更新