2017-06-05 157 views
1

我正在更新從4.3.3到4.9.4的手臂交叉編譯器。我看到的一個問題是,新編譯器不再自動包含依賴庫。例如:gcc鏈接器不會自動包含依賴庫

GCC ... -L -l -lssl -lrt

正常工作與以前的編譯器。如果libssl需要引用libcrypto中的某些內容,那麼鏈接程序會自動查找並鏈接到libcrypto(不需要-lcrypto)。

使用新的編譯器,這仍然有效,但前提是libssl不引用libcrypto中的任何內容。如果是這樣,那麼-lcyrpto是必需的。同樣的問題適用於-lpthread,-ldl等。

這是gcc行爲的變化還是在構建gcc時沒有正確配置?

回答

1

您使用的是靜態庫還是動態庫?對於動態庫,如果libssl取決於libcrypto,則只要libssl本身已正確鏈接,則不需要明確鏈接-lcrypto,但如果要直接在libcrypto的符號程序中使用,則必須明確地鏈接它。這是更新版本的binutils的改變/有意迴歸。

+0

這些是動態庫。 binutils也從2.18更新至2.28。所以我認爲你說這是binutils(ld)連接器的有意變化。 – Jay

+0

@Jay:是的,但binutils更改只會影響您,如果您的應用程序使用'libcrypto'中的符號而沒有顯式的'-lcrypto'。即使沒有'-lcrypto','libssl'使用'libcrypto'中的符號也很好,因爲動態庫存儲它的依賴信息。 –

+0

我的經驗與我對你所說的內容的理解不符。我用一個空的main()函數做了一個簡單的測試C文件,然後編譯並鏈接到我的庫(-lfoo)。 libfoo與-lssl和-lcrypto鏈接,事實上,objdump -x顯示庫將libssl和libcrypto列爲必需的。用舊的編譯器,我的測試程序編譯得很好。使用更新後的編譯器,除非我還將-lssl和-lcrypto添加到正在編譯的C文件中 - 即使它沒有引用這些庫,也不會。 – Jay