2016-01-22 51 views
0

我正在使用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 我想鏈接到一個kafka庫。 在系統目錄中有.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。 我該如何解決這個問題?爲什麼不建立偏好靜態庫?

回答

0

使用.a文件的完整路徑。因此,而不是

-lrdkafka 

使用

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

(通知缺乏 '-l')

另外,刪除的.so。 :)

這不是boost.build的行爲,這是多麼gcc和ld工作:

-l namespec --library = namespec

加入由namespec指定的歸檔或目標文件到要鏈接的文件列表。此選項可以使用任意次數。如果namespec的格式爲:filename,則ld將在庫路徑中搜索名爲filename的文件,否則它將在庫路徑中搜索名爲libnamespec.a的文件。 在支持共享庫的系統上,ld也可以搜索libnamespec.a以外的文件。具體來說,在ELF和SunOS系統上,ld將在搜索名爲libnamespec.so的庫之前搜索名爲libnamespec.a的庫。 (按照慣例,「.so」擴展名錶示一個共享庫。)請注意,此行爲不適用於:filename,它始終指定一個名爲filename的文件。

鏈接器只會在命令行中指定的位置搜索存檔。如果歸檔文件定義了一個符號,該符號在命令行上歸檔之前出現的某個對象中未定義,則鏈接器將從歸檔文件中包含相應的文件。但是,稍後在命令行中出現的對象中的未定義符號將不會導致鏈接器再次搜索存檔。

請參見 - (選項的方式來強制鏈接器多次搜索存檔

您可以列出在命令行上同一歸檔多次

這種類型的檔案搜索的是標準。對於Unix連接器,但是,如果您在AIX上使用ld,請注意它與AIX連接器的行爲不同。