使用 G++ 编译带有头文件和静态库的程序时,确定缺少依赖项的最佳方法是什么?

使用 G++ 编译带有头文件和静态库的程序时,确定缺少依赖项的最佳方法是什么?

我正在尝试编译 Acontis etherCAT 主堆栈的演示,但 G++ 在尝试编译时报告了许多未定义的引用,而没有给出任何关于需要包含哪些标头或库来纠正问题的线索。由于 G++ 不报告任何引用的缺失标头,因此我如何找出需要哪些文件来满足未定义的引用?

如果重要的话,我可以从源创建目标文件,链接期间会发生错误。 Acontis 没有提供 makefile。

Acontis for linux提供的文档如下: 2.5.1 编译demo Linux编译

我尝试使用 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

这是输出的一个简短片段: g++ 终端输出

我正在运行 Ubuntu 20.04,内核为 4.14.213-rt103 #1 SMP PREEMPT RT。 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

这似乎修复了一些未定义的引用,但很多仍然存在。

g++ 终端输出

答案1

有两个问题阻碍了程序的编译。

首先,正如 Steeldriver 所回答的,库路径未正确包含,并且 GCC 中未正确引用库。

其次,几个cpp源文件丢失,要么是意外删除,要么是第一次没有从存档中成功解压。

一旦这些问题得到纠正,程序就可以根据文档前面程序员提供的演示源文件列表在 GCC 中正确构建。

作为参考,由于 Acontis 不提供编译器示例,因此这些是允许 Acontis etherCAT master 演示在 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

相关内容