Ubuntu

使用 G++ 編譯帶有標頭檔和靜態庫的程序時,確定缺少依賴項的最佳方法是什麼?

  • January 15, 2021

我正在嘗試為 Acontis etherCAT 主堆棧編譯展示,但 G++ 在嘗試編譯時報告了許多未定義的引用,而沒有提供任何關於需要包含哪些標頭檔或庫來糾正問題的線索。由於 G++ 沒有報告任何引用的缺失標頭,我如何確定哪些文件需要滿足未定義的引用?

如果重要的話,我可以從原始碼創建目標文件,連結期間會發生錯誤。Acontis 沒有提供生成文件。

Acontis 為 linux 提供的文件如下: 2.5.1 編譯demo Linux 編譯

我嘗試使用 g++ 並尋找標題位置(簡化格式以使其更具可讀性並插入 <Install_Location> 以便每個參數都適合一行):

g++
-I &lt;Install_Location&gt;/Examples/EcMasterDemo/ 
-I &lt;Install_Location&gt;/SDK/INC/ 
-I &lt;Install_Location&gt;/SDK/INC/Linux 
-I &lt;Install_Location&gt;/Examples/Common/Linux 
-I &lt;Install_Location&gt;/Examples/Common/ 
-I &lt;Install_Location&gt;/Sources/Common 
-o test 
EcDemoApp.cpp 
&lt;Install_Location&gt;/Examples/Common/Linux/EcDemoMain.cpp 
&lt;Install_Location&gt;/Sources/Common/EcTimer.cpp 
&lt;Install_Location&gt;/SDK/LIB/Linux/x64/libAtemRasSrv.a 
&lt;Install_Location&gt;/SDK/LIB/Linux/x64/libEcMaster.a 
-pthread

這是輸出的一小段: g++ 終端輸出

我正在執行帶有 4.14.213-rt103 #1 SMP PREEMPT RT 核心的 Ubuntu 20.04。g++ 是 9.3.0 版


修復 -l 參數後更新(謝謝 steeldriver)

執行的命令:

/ClassB/Examples/EcMasterDemo$ gcc                            
&lt;Install_Dir&gt;/ClassB/Examples/Common/Linux/EcDemoMain.cpp                         
&lt;Install_Dir&gt;/ClassB/Examples/EcMasterDemo/EcDemoApp.cpp                          
&lt;Install_Dir&gt;/ClassB/Sources/Common/EcTimer.cpp                                   
-o test                                                                                                  
-I &lt;Install_Dir&gt;/ClassB/Examples/EcMasterDemo                                     
-I &lt;Install_Dir&gt;/ClassB/SDK/INC/Linux                                             
-I &lt;Install_Dir&gt;/ClassB/SDK/INC                                                   
-I &lt;Install_Dir&gt;/ClassB/Sources/Common                                            
-I &lt;Install_Dir&gt;/ClassB/Examples/Common                                           
-I &lt;Install_Dir&gt;/ClassB/Examples/Common/Linux                                     
-L &lt;Install_Dir&gt;/ClassB/SDK/LIB/Linux/x64                                         
-lAtemRasSrv -lEcMaster -pthread -ldl -lrt

這似乎修復了一些未定義的引用,但仍然存在很多。

g++ 終端輸出

有兩個問題阻止了程序的編譯。

首先,正如 steeldriver 所回答的那樣,庫路徑未正確包含,並且庫在 GCC 中未正確引用。

其次,失去了幾個 cpp 源文件,要麼是意外刪除,要麼是第一次沒有成功從存檔中解壓縮。

一旦這些問題得到糾正,程序就會根據文件前面的程序員提供的展示源文件列表在 GCC 中正確建構。

作為參考,由於 Acontis 不提供編譯器範例,這些是允許 Acontis etherCAT 主展示在 ubuntu linux 20.04 上建構的 G++ 參數:

g++                            
&lt;Install_Dir&gt;/ClassB/Examples/Common/Linux/EcDemoMain.cpp                         
&lt;Install_Dir&gt;/ClassB/Examples/EcMasterDemo/EcDemoApp.cpp                          
&lt;Install_Dir&gt;/ClassB/Examples/Common/EcDemoParms.cpp                              
&lt;Install_Dir&gt;/ClassB/Examples/Common/EcSelectLinkLayer.cpp                        
&lt;Install_Dir&gt;/ClassB/Examples/Common/EcNotification.cpp                           
&lt;Install_Dir&gt;/ClassB/Examples/Common/EcSdoServices.cpp                            
&lt;Install_Dir&gt;/ClassB/Examples/Common/EcSlaveInfo.cpp                              
&lt;Install_Dir&gt;/ClassB/Examples/Common/EcLogging.cpp                                
&lt;Install_Dir&gt;/ClassB/Sources/Common/EcTimer.cpp                                   
-o test                                                                                                  
-I &lt;Install_Dir&gt;/ClassB/Examples/EcMasterDemo                                     
-I &lt;Install_Dir&gt;/ClassB/SDK/INC/Linux                                             
-I &lt;Install_Dir&gt;/ClassB/SDK/INC                                                   
-I &lt;Install_Dir&gt;/ClassB/Sources/Common                                            
-I &lt;Install_Dir&gt;/ClassB/Examples/Common                                           
-I &lt;Install_Dir&gt;/ClassB/Examples/Common/Linux                                     
-L &lt;Install_Dir&gt;/ClassB/SDK/LIB/Linux/x64                                         
-lAtemRasSrv -lEcMaster -pthread -ldl -lrt -Wall

引用自:https://unix.stackexchange.com/questions/629039