我正在尝试编译 Acontis etherCAT 主堆栈的演示,但 G++ 在尝试编译时报告了许多未定义的引用,而没有给出任何关于需要包含哪些标头或库来纠正问题的线索。由于 G++ 不报告任何引用的缺失标头,因此我如何找出需要哪些文件来满足未定义的引用?
如果重要的话,我可以从源创建目标文件,链接期间会发生错误。 Acontis 没有提供 makefile。
我尝试使用 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
我正在运行 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
这似乎修复了一些未定义的引用,但很多仍然存在。
答案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