Ubuntu
使用 G++ 編譯帶有標頭檔和靜態庫的程序時,確定缺少依賴項的最佳方法是什麼?
我正在嘗試為 Acontis etherCAT 主堆棧編譯展示,但 G++ 在嘗試編譯時報告了許多未定義的引用,而沒有提供任何關於需要包含哪些標頭檔或庫來糾正問題的線索。由於 G++ 沒有報告任何引用的缺失標頭,我如何確定哪些文件需要滿足未定義的引用?
如果重要的話,我可以從原始碼創建目標文件,連結期間會發生錯誤。Acontis 沒有提供生成文件。
我嘗試使用 g++ 並尋找標題位置(簡化格式以使其更具可讀性並插入 <Install_Location> 以便每個參數都適合一行):
g++ -I <Install_Location>/Examples/EcMasterDemo/ -I <Install_Location>/SDK/INC/ -I <Install_Location>/SDK/INC/Linux -I <Install_Location>/Examples/Common/Linux -I <Install_Location>/Examples/Common/ -I <Install_Location>/Sources/Common -o test EcDemoApp.cpp <Install_Location>/Examples/Common/Linux/EcDemoMain.cpp <Install_Location>/Sources/Common/EcTimer.cpp <Install_Location>/SDK/LIB/Linux/x64/libAtemRasSrv.a <Install_Location>/SDK/LIB/Linux/x64/libEcMaster.a -pthread
我正在執行帶有 4.14.213-rt103 #1 SMP PREEMPT RT 核心的 Ubuntu 20.04。g++ 是 9.3.0 版
修復 -l 參數後更新(謝謝 steeldriver)
執行的命令:
/ClassB/Examples/EcMasterDemo$ gcc <Install_Dir>/ClassB/Examples/Common/Linux/EcDemoMain.cpp <Install_Dir>/ClassB/Examples/EcMasterDemo/EcDemoApp.cpp <Install_Dir>/ClassB/Sources/Common/EcTimer.cpp -o test -I <Install_Dir>/ClassB/Examples/EcMasterDemo -I <Install_Dir>/ClassB/SDK/INC/Linux -I <Install_Dir>/ClassB/SDK/INC -I <Install_Dir>/ClassB/Sources/Common -I <Install_Dir>/ClassB/Examples/Common -I <Install_Dir>/ClassB/Examples/Common/Linux -L <Install_Dir>/ClassB/SDK/LIB/Linux/x64 -lAtemRasSrv -lEcMaster -pthread -ldl -lrt
這似乎修復了一些未定義的引用,但仍然存在很多。
有兩個問題阻止了程序的編譯。
首先,正如 steeldriver 所回答的那樣,庫路徑未正確包含,並且庫在 GCC 中未正確引用。
其次,失去了幾個 cpp 源文件,要麼是意外刪除,要麼是第一次沒有成功從存檔中解壓縮。
一旦這些問題得到糾正,程序就會根據文件前面的程序員提供的展示源文件列表在 GCC 中正確建構。
作為參考,由於 Acontis 不提供編譯器範例,這些是允許 Acontis etherCAT 主展示在 ubuntu linux 20.04 上建構的 G++ 參數:
g++ <Install_Dir>/ClassB/Examples/Common/Linux/EcDemoMain.cpp <Install_Dir>/ClassB/Examples/EcMasterDemo/EcDemoApp.cpp <Install_Dir>/ClassB/Examples/Common/EcDemoParms.cpp <Install_Dir>/ClassB/Examples/Common/EcSelectLinkLayer.cpp <Install_Dir>/ClassB/Examples/Common/EcNotification.cpp <Install_Dir>/ClassB/Examples/Common/EcSdoServices.cpp <Install_Dir>/ClassB/Examples/Common/EcSlaveInfo.cpp <Install_Dir>/ClassB/Examples/Common/EcLogging.cpp <Install_Dir>/ClassB/Sources/Common/EcTimer.cpp -o test -I <Install_Dir>/ClassB/Examples/EcMasterDemo -I <Install_Dir>/ClassB/SDK/INC/Linux -I <Install_Dir>/ClassB/SDK/INC -I <Install_Dir>/ClassB/Sources/Common -I <Install_Dir>/ClassB/Examples/Common -I <Install_Dir>/ClassB/Examples/Common/Linux -L <Install_Dir>/ClassB/SDK/LIB/Linux/x64 -lAtemRasSrv -lEcMaster -pthread -ldl -lrt -Wall