Acontis etherCAT 메인 스택의 데모를 컴파일하려고 하는데, 문제를 해결하기 위해 어떤 헤더나 라이브러리를 포함해야 하는지에 대한 단서를 제공하지 않고 컴파일하려고 할 때 G++에서 정의되지 않은 많은 참조를 보고합니다. G++는 어떤 참조에 대해서도 누락된 헤더를 보고하지 않으므로 정의되지 않은 참조를 충족시키기 위해 어떤 파일이 필요한지 어떻게 알 수 있습니까?
중요한 경우 소스에서 개체 파일을 만들 수 있으며 연결 중에 오류가 발생합니다. Acontis는 makefile을 제공하지 않습니다.
Linux용 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
이는 정의되지 않은 일부 참조를 수정한 것으로 보이지만 여전히 많은 참조가 있습니다.
답변1
프로그램 컴파일을 방해하는 두 가지 문제가 있습니다.
첫째, Steeldriver가 답변한 대로 라이브러리 경로가 올바르게 포함되지 않았으며 GCC에서 라이브러리가 제대로 참조되지 않았습니다.
둘째, 실수로 삭제되었거나 처음 아카이브에서 성공적으로 추출되지 않아 여러 cpp 소스 파일이 누락되었습니다.
이러한 문제가 수정되면 프로그램은 문서 앞부분에서 프로그래머가 제공한 데모 소스 파일 목록을 기반으로 GCC에서 올바르게 빌드됩니다.
참고로 Acontis는 컴파일러 예제를 제공하지 않으므로 Ubuntu Linux 20.04에서 Acontis etherCAT 마스터 데모를 구축할 수 있는 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