链接boost库时,程序无错误退出 我把Boost库链接到我的交叉编译的C++程序中有问题。 我写的代码是在Ubuntu12.04下为arm目标(Pandorn,也是Ubuntu12.04)与CodeSourcery交叉编译的。 编译没有库的简单测试程序很好,即使是带有静态库的OpenCV也很好

链接boost库时,程序无错误退出 我把Boost库链接到我的交叉编译的C++程序中有问题。 我写的代码是在Ubuntu12.04下为arm目标(Pandorn,也是Ubuntu12.04)与CodeSourcery交叉编译的。 编译没有库的简单测试程序很好,即使是带有静态库的OpenCV也很好,c++,boost,linker,arm,shared-libraries,C++,Boost,Linker,Arm,Shared Libraries,但链接boost 1.52.0库时存在以下问题: 当使用链接boost库(-lboost_线程-lboost_系统)交叉编译时,程序编译时不会出错,但在目标上执行时,不会发生任何事情 程序完成时不会出错,就像从未执行过一样。 在不链接boost库的情况下使用codesource进行交叉编译时:一切都可以在目标上正常工作。 用g++本地编译:一切都很好 出于测试目的,我将代码精简为以下几行: (当没有使用计时功能时,甚至会出现错误。仅链接就可以改变) main.cpp #include <i

但链接boost 1.52.0库时存在以下问题:

当使用链接boost库(-lboost_线程-lboost_系统)交叉编译时,程序编译时不会出错,但在目标上执行时,不会发生任何事情

程序完成时不会出错,就像从未执行过一样。

在不链接boost库的情况下使用codesource进行交叉编译时:一切都可以在目标上正常工作。 用g++本地编译:一切都很好

出于测试目的,我将代码精简为以下几行: (当没有使用计时功能时,甚至会出现错误。仅链接就可以改变)

main.cpp

#include <iostream>
using namespace std;

#include<boost/chrono.hpp>

int main(int argc, char* argv[]) {

    cout << "!!!this test worked!!!" << endl;

    return 0;
}
boost库是使用CodeSourcery arm-none-linux-gnueabi-g++交叉编译的。 我将它们全部复制到/usr/lib文件夹的目标中,并将/usr/lib添加到PATH和LD_LIBRARY_PATH中

我试着用eclipse进行远程调试,结果是一样的:启动程序。。程序以1终止。 但是什么也没发生

它甚至不会打印错误或抱怨丢失的内容。 所以到现在为止,我想不出还有什么我可以用谷歌搜索的,我还没有尝试过的

你能给我一些提示,我可以试着解决这个问题吗

非常感谢


更新:

使用strace运行我的测试程序时,日志包含以下信息:

$ vi strace-testARM.log 22:23:56.511385 execve("./testARM", ["./testARM"], [/* 17 vars */]) = 0 22:23:56.512789 brk(0) = 0xfae000 22:23:56.512972 uname({sys="Linux", node="panda", ...}) = 0 22:23:56.514010 access("/etc/ld.so.nohwcap", F_OK) = -1 ENOENT (No such file or directory) 22:23:56.514315 mmap2(NULL, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0xb6f9b000 22:23:56.514498 access("/etc/ld.so.preload", R_OK) = -1 ENOENT (No such file or directory) 22:23:56.514742 open("/etc/ld.so.cache", O_RDONLY|O_CLOEXEC) = 3 22:23:56.514986 fstat64(3, {st_mode=S_IFREG|0644, st_size=52288, ...}) = 0 22:23:56.515353 mmap2(NULL, 52288, PROT_READ, MAP_PRIVATE, 3, 0) = 0xb6f72000 22:23:56.515536 close(3) = 0 22:23:56.515688 access("/etc/ld.so.nohwcap", F_OK) = -1 ENOENT (No such file or directory) 22:23:56.515902 open("/lib/arm-linux-gnueabihf/libpthread.so.0", O_RDONLY|O_CLOEXEC) = 3 22:23:56.516207 read(3, "\177ELF\1\1\1\0\0\0\0\0\0\0\0\0\3\0(\0\1\0\0\0\5P\0\0004\0\0\0"..., 512) = 512 22:23:56.516451 lseek(3, 66332, SEEK_SET) = 66332 22:23:56.516573 read(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 1400) = 1400 22:23:56.516787 lseek(3, 65924, SEEK_SET) = 65924 22:23:56.516909 read(3, "A6\0\0\0aeabi\0\1,\0\0\0\0057-A\0\6\n\7A\10\1\t\2\n\4\22"..., 55) = 55 22:23:56.517153 fstat64(3, {st_mode=S_IFREG|0755, st_size=100802, ...}) = 0 22:23:56.517519 mmap2(NULL, 107024, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0xb6f57000 22:23:56.517642 mprotect(0xb6f67000, 28672, PROT_NONE) = 0 22:23:56.517794 mmap2(0xb6f6e000, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0xf) = 0xb6f6e000 22:23:56.517977 mmap2(0xb6f70000, 4624, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0) = 0xb6f70000 22:23:56.518160 close(3) = 0 22:23:56.518313 access("/etc/ld.so.nohwcap", F_OK) = -1 ENOENT (No such file or directory) 22:23:56.518557 open("/lib/arm-linux-gnueabihf/tls/v7l/neon/vfp/libboost_thread.so.1.52.0", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory) 22:23:56.518832 stat64("/lib/arm-linux-gnueabihf/tls/v7l/neon/vfp", 0xbea34ea8) = -1 ENOENT (No such file or directory) 22:23:56.519076 open("/lib/arm-linux-gnueabihf/tls/v7l/neon/libboost_thread.so.1.52.0", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file ... [ lots of other directories with file not found ] ... 22:23:56.545382 stat64("/usr/lib/neon/vfp", 0xbea34ea8) = -1 ENOENT (No such file or directory) 22:23:56.545565 open("/usr/lib/neon/libboost_thread.so.1.52.0", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory) 22:23:56.545748 stat64("/usr/lib/neon", 0xbea34ea8) = -1 ENOENT (No such file or directory) 22:23:56.545932 open("/usr/lib/vfp/libboost_thread.so.1.52.0", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory) 22:23:56.546115 stat64("/usr/lib/vfp", 0xbea34ea8) = -1 ENOENT (No such file or directory) 22:23:56.546298 open("/usr/lib/libboost_thread.so.1.52.0", O_RDONLY|O_CLOEXEC) = 3 22:23:56.546481 read(3, "\177ELF\1\1\1\0\0\0\0\0\0\0\0\0\3\0(\0\1\0\0\0\324\331\0\0004\0\0\0"..., 512) = 512 22:23:56.546755 lseek(3, 121020, SEEK_SET) = 121020 22:23:56.546878 read(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 1200) = 1200 22:23:56.547091 lseek(3, 119052, SEEK_SET) = 119052 22:23:56.547213 read(3, "A(\0\0\0aeabi\0\1\36\0\0\0\0055TE\0\6\4\10\1\t\1\22\4\24\1\25"..., 41) = 41 22:23:56.547396 exit_group(1) = ? 将
-v-H
添加到我收到的编译g++表达式中:

... /xy/CodeSourcery/bin/../lib/gcc/arm-none-linux-gnueabi/4.7.2/../../../../arm-none-linux-gnueabi/include/boost/utility/result_of.hpp

COLLECT_GCC_OPTIONS='-O0' '-g3' '-Wall' '-c' '-fmessage-length=0' '-v' '-H' '-MMD' '-MP' '-MF' 'main.d' '-MT' 'main.d' '-o' 'main.o' '-shared-libgcc' '-march=armv5te' '-mtls-dialect=gnu' '-funwind-tables' '-D' '__CS_SOURCERYGXX_MAJ__=2012' '-D' '__CS_SOURCERYGXX_MIN__=9' '-D' '__CS_SOURCERYGXX_REV__=64'
 /xy/CodeSourcery/bin/../lib/gcc/arm-none-linux-gnueabi/4.7.2/../../../../arm-none-linux-gnueabi/bin/as -v -march=armv5te -meabi=5 -o main.o /tmp/cceTwLmn.s
GNU assembler version 2.23.51 (arm-none-linux-gnueabi) using BFD version (Sourcery CodeBench Lite 2012.09-64) 2.23.51.20120829
COMPILER_PATH=/xy/CodeSourcery/bin/../libexec/gcc/arm-none-linux-gnueabi/4.7.2/:/xy/CodeSourcery/bin/../libexec/gcc/:/xy/CodeSourcery/bin/../lib/gcc/arm-none-linux-gnueabi/4.7.2/../../../../arm-none-linux-gnueabi/bin/
LIBRARY_PATH=/xy/CodeSourcery/bin/../lib/gcc/arm-none-linux-gnueabi/4.7.2/:/xy/CodeSourcery/bin/../lib/gcc/:/xy/CodeSourcery/bin/../lib/gcc/arm-none-linux-gnueabi/4.7.2/../../../../arm-none-linux-gnueabi/lib/:/xy/CodeSourcery/bin/../arm-none-linux-gnueabi/libc/lib/:/xy/CodeSourcery/bin/../arm-none-linux-gnueabi/libc/usr/lib/
COLLECT_GCC_OPTIONS='-O0' '-g3' '-Wall' '-c' '-fmessage-length=0' '-v' '-H' '-MMD' '-MP' '-MF' 'main.d' '-MT' 'main.d' '-o' 'main.o' '-shared-libgcc' '-march=armv5te' '-mtls-dialect=gnu' '-funwind-tables' '-D' '__CS_SOURCERYGXX_MAJ__=2012' '-D' '__CS_SOURCERYGXX_MIN__=9' '-D' '__CS_SOURCERYGXX_REV__=64'

**** Build Finished ****

(这是最后一部分,上面列出了大量包含的标题。xy路径是CodeSourcery安装在我的主目录中的位置)

构建ARM应用程序的一般规则(事实上,它必须适用于任何平台)

您必须使用相同的ABI编译整个程序,并链接到一组兼容的库

在您的情况下,最后一项看起来像
/usr/lib/libboost_thread.so.1.52.0
,因为它也与您的使用有关,所以请确保
libboost_thread
与您交叉编译的主机上的线程匹配

22:23:56.546298 open("/usr/lib/libboost_thread.so.1.52.0", O_RDONLY|O_CLOEXEC) = 3
22:23:56.546481 read(3, "\177ELF\1\1\1\0\0\0\0\0\0\0\0\0\3\0(\0\1\0\0\0\324\331\0\0004\0\0\0"..., 512) = 512
22:23:56.546755 lseek(3, 121020, SEEK_SET) = 121020
22:23:56.546878 read(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 1200) = 1200
22:23:56.547091 lseek(3, 119052, SEEK_SET) = 119052
22:23:56.547213 read(3, "A(\0\0\0aeabi\0\1\36\0\0\0\0055TE\0\6\4\10\1\t\1\22\4\24\1\25"..., 41) = 41
22:23:56.547396 exit_group(1)           = ?
使用
ARM
系统,您可以拥有许多库的变体,如不同的ABIs或VFP/NEON支持,并且获得现成的工具链可能与默认情况下的目标不匹配,因为它是针对ARM的

更新

如果您查看以前的日志

22:23:56.515902 open("/lib/arm-linux-gnueabihf/libpthread.so.0", O_RDONLY|O_CLOEXEC) = 3
22:23:56.516207 read(3, "\177ELF\1\1\1\0\0\0\0\0\0\0\0\0\3\0(\0\1\0\0\0\5P\0\0004\0\0\0"..., 512) = 512
22:23:56.516451 lseek(3, 66332, SEEK_SET) = 66332
22:23:56.516573 read(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 1400) = 1400
22:23:56.516787 lseek(3, 65924, SEEK_SET) = 65924
22:23:56.516909 read(3, "A6\0\0\0aeabi\0\1,\0\0\0\0057-A\0\6\n\7A\10\1\t\2\n\4\22"..., 55) = 55
您可以看到两件事,首先,您的系统是从路径
hf
。在读取的数据中,我们还可以看到
7-A
,这可能意味着ARMv7-A,而
5TE
可能意味着libboost_线程库中的ARMv5TE。您应该使用工具链中的readelf来获取关于elf文件的信息,而不是文件实用程序

我将尝试使用
-march=armv7-a-mfpu=vfpv3-d16-mfloat abi=hard
编译boost,并将生成的二进制文件放在“/usr/lib/vfp”下


我认为从Debian网站上阅读对你有很大帮助,你应该自己做一些小练习,而不是处理boost的编译过程来了解情况。

你能用strace()在target上运行你的程序吗?谢谢你的回答。我把战略日志贴在上面。您可以从中获得有用的信息吗?您可以在目标上发出“
ldd
testARM”,以确保所有引用都已解决。键入“ldd testARM”时,它会说“不是动态可执行文件”,只是为了清楚起见,您正在ARM目标上运行
ldd testARM
,对吗?另外,在您的测试程序和相关的libboost_线程库上运行
文件
。感谢这一提示,我现在对ABI和abihf(显然是Ubuntu 12.04的默认设置)进行了一些研究。我现在尝试编译完整的boost库,然后使用标记
-mfloat ABI=hard
,编译我的程序,不幸的是,在这两种情况下,mfloat abi=softfp都没有发生任何变化。从我目前阅读的内容来看,我可以想象的一件事是,该程序在运行时混合了硬浮点和软浮点库。有没有办法执行程序,强制它只搜索所需的共享库?(例如,
libstdc++
等…)在
/usr/lib/
文件夹中有一个,在
/usr/lib/arm-linux-gnueabihf
中有一个,经过大量的重新编译和库复制,我需要说“使用这个”。用
-march=armv7-a-mfpu=vfpv3-d16-mfloat abi=hard
编译了boost和我的程序,现在它可以工作了。非常感谢您@auselen。
22:23:56.546298 open("/usr/lib/libboost_thread.so.1.52.0", O_RDONLY|O_CLOEXEC) = 3
22:23:56.546481 read(3, "\177ELF\1\1\1\0\0\0\0\0\0\0\0\0\3\0(\0\1\0\0\0\324\331\0\0004\0\0\0"..., 512) = 512
22:23:56.546755 lseek(3, 121020, SEEK_SET) = 121020
22:23:56.546878 read(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 1200) = 1200
22:23:56.547091 lseek(3, 119052, SEEK_SET) = 119052
22:23:56.547213 read(3, "A(\0\0\0aeabi\0\1\36\0\0\0\0055TE\0\6\4\10\1\t\1\22\4\24\1\25"..., 41) = 41
22:23:56.547396 exit_group(1)           = ?
22:23:56.515902 open("/lib/arm-linux-gnueabihf/libpthread.so.0", O_RDONLY|O_CLOEXEC) = 3
22:23:56.516207 read(3, "\177ELF\1\1\1\0\0\0\0\0\0\0\0\0\3\0(\0\1\0\0\0\5P\0\0004\0\0\0"..., 512) = 512
22:23:56.516451 lseek(3, 66332, SEEK_SET) = 66332
22:23:56.516573 read(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 1400) = 1400
22:23:56.516787 lseek(3, 65924, SEEK_SET) = 65924
22:23:56.516909 read(3, "A6\0\0\0aeabi\0\1,\0\0\0\0057-A\0\6\n\7A\10\1\t\2\n\4\22"..., 55) = 55