1

我能够成功交叉编译可以在 ARM 系统(如 Rasberry Pi)上运行的二进制文件。在没有链接到第三方库的情况下,正常的 C++ 代码可以在设备上成功运行(IE cout << "Hello World!" << endl;)。

我遇到的问题是,当我在与第三方库链接后运行可执行文件时,我收到标准 UNIX 错误“没有这样的文件或目录”。当二进制文件尝试访问共享对象文件时。我将它要查找的文件复制到 usr/lib 文件夹、usr/local/lib 文件夹以及可执行文件所在的文件夹中。

此外,我还为 LD_LIBRARY_PATH 添加了一个很好的值,以便运行时链接器可以在这些位置进行搜索。我的猜测是“系统”可能会从可执行文件中隐藏这些文件?

为了添加更多信息,我在二进制文件和共享对象文件上运行了 readelf 命令,它为我提供了文件的正确描述。它告诉我二进制文件是一个 32 位文件,并且需要我提到它找不到的这个共享对象库文件。即使在构建阶段的链接期间,我也会添加以下链接器命令 -Wl,-rpath,以设置查找共享对象文件的位置。请注意,我是在 Macintosh 机器上编译,而不是在 Rasberry Pi 本身上编译。因此交叉编译。

我觉得这是一个设置,因为目标文件在多个位置可见/有效。如果有人以前经历过这种情况,请提供任何建议。提前致谢。

4

1 回答 1

1

我实际上最近发现了这个问题。

问题是我使用的是 Eclipse。我使用的第三方库文件以“libSHAREDFILENAME.so”格式命名。Eclipse 在设置要在 IDE 中使用的库时不太喜欢这样。它希望您从文件名中去掉“lib”和“.so”部分。所以一个名为“libSHAREDOBJECT.so”的文件在 Eclipse 中应该被引用为“SHAREDOBJECT”。它不喜欢“lib”前缀或“.so”后缀。

于 2013-10-04T16:55:58.630 回答