我有一个在目标机器上编译的项目(nvidia jetson),我正在尝试交叉编译。我被困在链接步骤中,正在寻找次要依赖项。
我的构建在这一步失败了:
/home/lhahn/Documents/CrossCompilation/gcc-linaro-7.3.1-2018.05-x86_64_aarch64-linux-gnu/bin/aarch64-linux-gnu-g++ --sysroot=/home/lhahn/Documents/CrossCompilation/Images/jetson -O2 -g -DNDEBUG CMakeFiles/VsCommunication.dir/GetStatus.pb.cc.o CMakeFiles/VsCommunication.dir/Init.pb.cc.o CMakeFiles/VsCommunication.dir/Nack.pb.cc.o CMakeFiles/VsCommunication.dir/StartProduction.pb.cc.o CMakeFiles/VsCommunication.dir/AppData.pb.cc.o CMakeFiles/VsCommunication.dir/Counter.pb.cc.o CMakeFiles/VsCommunication.dir/Marker.pb.cc.o CMakeFiles/VsCommunication.dir/Program.pb.cc.o CMakeFiles/VsCommunication.dir/RoboterSettings.pb.cc.o CMakeFiles/VsCommunication.dir/LiveImage.pb.cc.o CMakeFiles/VsCommunication.dir/Format.pb.cc.o CMakeFiles/VsCommunication.dir/VersionCheckVsPs.pb.cc.o CMakeFiles/VsCommunication.dir/main.cpp.o CMakeFiles/VsCommunication.dir/vs_c_tcpAcceptor.cpp.o CMakeFiles/VsCommunication.dir/vs_c_tcpStream.cpp.o CMakeFiles/VsCommunication.dir/vs_c_thread.cpp.o CMakeFiles/VsCommunication.dir/vs_c_init.cpp.o CMakeFiles/VsCommunication.dir/vs_c_status.cpp.o CMakeFiles/VsCommunication.dir/vs_c_productionState.cpp.o CMakeFiles/VsCommunication.dir/vs_c_app.cpp.o CMakeFiles/VsCommunication.dir/vs_c_program.cpp.o CMakeFiles/VsCommunication.dir/vs_c_liveImage.cpp.o CMakeFiles/VsCommunication.dir/vs_c_format.cpp.o CMakeFiles/VsCommunication.dir/vs_c_calibration.cpp.o CMakeFiles/VsCommunication.dir/vs_c_marker.cpp.o CMakeFiles/VsCommunication.dir/vs_c_versionCheckVsPs.cpp.o -o ../bin/VsCommunication -Wl,-rpath,/home/lhahn/Documents/git/VisionSystem/build/lib:/usr/local/lib:/home/lhahn/Documents/CrossCompilation/Images/jetson/usr/lib/aarch64-linux-gnu ../lib/libVsJsonParser.so ../lib/libRedisClient.so -lstdc++fs -pthread ../lib/libNanoLog.so /home/lhahn/Documents/CrossCompilation/Images/jetson/usr/local/lib/libprotobuf.so -lhiredis -lstdc++fs
有错误
/home/lhahn/Documents/CrossCompilation/gcc-linaro-7.3.1-2018.05-x86_64_aarch64-linux-gnu/bin/../lib/gcc/aarch64-linux-gnu/7.3.1/../../../../aarch64-linux-gnu/bin/ld: warning: libz.so.1, needed by /home/lhahn/Documents/CrossCompilation/Images/jetson/usr/local/lib/libprotobuf.so, not found (try using -rpath or -rpath-link)
/home/lhahn/Documents/CrossCompilation/gcc-linaro-7.3.1-2018.05-x86_64_aarch64-linux-gnu/bin/../lib/gcc/aarch64-linux-gnu/7.3.1/../../../../aarch64-linux-gnu/bin/ld: warning: libm.so.6, needed by /home/lhahn/Documents/CrossCompilation/gcc-linaro-7.3.1-2018.05-x86_64_aarch64-linux-gnu/bin/../lib/gcc/aarch64-linux-gnu/7.3.1/../../../../aarch64-linux-gnu/lib/../lib64/libstdc++.so, not found (try using -rpath or -rpath-link)
/home/lhahn/Documents/CrossCompilation/Images/jetson/usr/local/lib/libprotobuf.so: undefined reference to `deflateInit2_'
/home/lhahn/Documents/CrossCompilation/Images/jetson/usr/local/lib/libprotobuf.so: undefined reference to `deflate'
/home/lhahn/Documents/CrossCompilation/Images/jetson/usr/local/lib/libprotobuf.so: undefined reference to `deflateEnd'
/home/lhahn/Documents/CrossCompilation/Images/jetson/usr/local/lib/libprotobuf.so: undefined reference to `inflate'
/home/lhahn/Documents/CrossCompilation/Images/jetson/usr/local/lib/libprotobuf.so: undefined reference to `inflateInit2_'
/home/lhahn/Documents/CrossCompilation/Images/jetson/usr/local/lib/libprotobuf.so: undefined reference to `inflateEnd'
collect2: error: ld returned 1 exit status
现在我专注于第一个问题,找不到 libz。
我阅读了关于次要依赖项的 this,据我所知 libprotobuf.so 已正确链接(请参阅下面的 readelf 输出),但错误消息看起来与上面链接中的“愚蠢”示例完全相同.
readelf -d libprotobuf.so
Dynamic section at offset 0x29ccd0 contains 32 entries:
Tag Type Name/Value
0x0000000000000001 (NEEDED) Shared library: [libpthread.so.0]
0x0000000000000001 (NEEDED) Shared library: [libz.so.1]
0x0000000000000001 (NEEDED) Shared library: [libstdc++.so.6]
...
因此,我尝试在博客文章“正确的方式”中进行链接,如下所示:
/home/lhahn/Documents/CrossCompilation/gcc-linaro-7.3.1-2018.05-x86_64_aarch64-linux-gnu/bin/aarch64-linux-gnu-g++ --sysroot=/home/lhahn/Documents/CrossCompilation/Images/jetson -O2 -g -DNDEBUG CMakeFiles/VsCommunication.dir/GetStatus.pb.cc.o CMakeFiles/VsCommunication.dir/Init.pb.cc.o CMakeFiles/VsCommunication.dir/Nack.pb.cc.o CMakeFiles/VsCommunication.dir/StartProduction.pb.cc.o CMakeFiles/VsCommunication.dir/AppData.pb.cc.o CMakeFiles/VsCommunication.dir/Counter.pb.cc.o CMakeFiles/VsCommunication.dir/Marker.pb.cc.o CMakeFiles/VsCommunication.dir/Program.pb.cc.o CMakeFiles/VsCommunication.dir/RoboterSettings.pb.cc.o CMakeFiles/VsCommunication.dir/LiveImage.pb.cc.o CMakeFiles/VsCommunication.dir/Format.pb.cc.o CMakeFiles/VsCommunication.dir/VersionCheckVsPs.pb.cc.o CMakeFiles/VsCommunication.dir/main.cpp.o CMakeFiles/VsCommunication.dir/vs_c_tcpAcceptor.cpp.o CMakeFiles/VsCommunication.dir/vs_c_tcpStream.cpp.o CMakeFiles/VsCommunication.dir/vs_c_thread.cpp.o CMakeFiles/VsCommunication.dir/vs_c_init.cpp.o CMakeFiles/VsCommunication.dir/vs_c_status.cpp.o CMakeFiles/VsCommunication.dir/vs_c_productionState.cpp.o CMakeFiles/VsCommunication.dir/vs_c_app.cpp.o CMakeFiles/VsCommunication.dir/vs_c_program.cpp.o CMakeFiles/VsCommunication.dir/vs_c_liveImage.cpp.o CMakeFiles/VsCommunication.dir/vs_c_format.cpp.o CMakeFiles/VsCommunication.dir/vs_c_calibration.cpp.o CMakeFiles/VsCommunication.dir/vs_c_marker.cpp.o CMakeFiles/VsCommunication.dir/vs_c_versionCheckVsPs.cpp.o -o ../bin/VsCommunication -Wl,-rpath,/home/lhahn/Documents/git/VisionSystem/build/lib:/usr/local/lib:/home/lhahn/Documents/CrossCompilation/Images/jetson/usr/lib/aarch64-linux-gnu ../lib/libVsJsonParser.so ../lib/libRedisClient.so -lstdc++fs -pthread ../lib/libNanoLog.so /home/lhahn/Documents/CrossCompilation/Images/jetson/usr/local/lib/libprotobuf.so -Wl,-rpath-link,/home/lhahn/Documents/CrossCompilation/Images/jetson/usr/lib/aarch64-linux-gnu -lhiredis -lstdc++fs
注意 -Wl,-rpath-link,/home/lhahn/Documents/CrossCompilation/Images/jetson/usr/lib/aarch64-linux-gnu
,它应该将链接器指向 libz 依赖项。
然而,我仍然得到完全相同的结果。
如果您对我遗漏的内容有任何建议,我将不胜感激