我能够成功交叉编译可以在ARM系统(如Rasberry Pi)上运行的二进制文件。在没有链接到第三方库的情况下,正常的C ++代码在设备上成功运行(I.E. cout<<“Hello World!”<< endl;)。
我遇到的问题是,当我将可执行文件链接到第三方库后运行时,我得到标准的UNIX错误“没有这样的文件或目录”。当二进制文件尝试访问共享对象文件时。我有它正在寻找的文件被复制到usr / lib文件夹,usr / local / lib文件夹,以及可执行文件所在的文件夹。
此外,我去为LD_LIBRARY_PATH添加了一个很好的值,因此运行时链接程序可以在这些位置进行搜索。我的猜测是“系统”可能隐藏了可执行文件中的这些文件?
为了添加更多信息,我在二进制文件和共享对象文件上运行了readelf命令,它给了我正确的文件描述。它告诉我,二进制文件是一个32位文件,需要我提到的这个共享对象库文件找不到。即使在构建阶段的链接时,我也会添加以下链接器命令-Wl,-rpath,以设置查找共享对象文件的位置。请注意我在Macintosh机器上编译,而不是在Rasberry Pi本身上编译。因此交叉编译。
我感觉这是一个设置,因为目标文件在多个位置可见/有效。如果有人以前经历过这个,请任何建议表示赞赏。提前谢谢。
答案 0 :(得分:1)
我实际上最近发现了这个问题。
问题在于我使用的是Eclipse。我使用的第三方库文件以“libSHAREDFILENAME.so”格式命名。在设置要在IDE中使用的库时,Eclipse不太喜欢它。它希望您从文件名中删除“lib”和“.so”部分。因此,名为“libSHAREDOBJECT.so”的文件应在Eclipse中引用为“SHAREDOBJECT”。它不喜欢“lib”前缀或“.so”后缀。