C++ Chroot交叉编译未定义的符号
我正在尝试将应用程序从Ubuntu 14.04“交叉编译”到Debian Wheezy 7.9(两者之间不兼容的libc版本)。我已经安装了chroot环境,在那里我安装了debian Wheezy。我在Ubuntu上使用代码块进行编译。我已经设置了这个项目,所以我只使用chroot环境中的东西(即gcc、libc等)。我还使用了C++ Chroot交叉编译未定义的符号,c++,linux,ubuntu,gcc,chroot,C++,Linux,Ubuntu,Gcc,Chroot,我正在尝试将应用程序从Ubuntu 14.04“交叉编译”到Debian Wheezy 7.9(两者之间不兼容的libc版本)。我已经安装了chroot环境,在那里我安装了debian Wheezy。我在Ubuntu上使用代码块进行编译。我已经设置了这个项目,所以我只使用chroot环境中的东西(即gcc、libc等)。我还使用了-nodefaultlibs并手动链接所有内容。但即使这样,我也有一些未解决的符号,不知道它们来自哪里 /var/chroot/usr/lib/gcc/x86_64-l
-nodefaultlibs
并手动链接所有内容。但即使这样,我也有一些未解决的符号,不知道它们来自哪里
/var/chroot/usr/lib/gcc/x86_64-linux-gnu/4.7/libgcc_s.so: undefined reference to `memcpy@GLIBC_2.14'
/var/chroot/usr/lib/x86_64-linux-gnu/librt.so: undefined reference to `__clock_getres@GLIBC_PRIVATE'
/var/chroot/usr/lib/x86_64-linux-gnu/librt.so: undefined reference to `__pthread_get_minstack@GLIBC_PRIVATE'
/var/chroot/usr/lib/x86_64-linux-gnu/librt.so: undefined reference to `__clock_gettime@GLIBC_PRIVATE'
/var/chroot/usr/lib/x86_64-linux-gnu/librt.so: undefined reference to `__clock_nanosleep@GLIBC_PRIVATE'
/var/chroot/usr/lib/x86_64-linux-gnu/librt.so: undefined reference to `__clock_getcpuclockid@GLIBC_PRIVATE'
/var/chroot/usr/lib/x86_64-linux-gnu/librt.so: undefined reference to `__clock_settime@GLIBC_PRIVATE'
/var/chroot/usr/lib/gcc/x86_64-linux-gnu/4.7/libgcc_s.so没有引用2.14(通过objdump查看)
这是我的命令行:
g++-4.7 -L../Debug
-L../dependencies/lib/debug
-L/var/chroot/usr/lib/gcc/x86_64-linux-gnu/4.7
-L/var/chroot/lib/x86_64-linux-gnu
-L/var/chroot/usr/lib/x86_64-linux-gnu
-L/var/chroot/usr/lib
-o ../Debug/xxx obj/Debug/src/xxx.o
-nostdlib -Wl,-t
/var/chroot/usr/lib/x86_64-linux-gnu/crt1.o
/var/chroot/usr/lib/x86_64-linux-gnu/crti.o
/var/chroot/usr/lib/gcc/x86_64-linux-gnu/4.7/crtbegin.o
-lboost_system-gcc47-mt-d-1_55
-lboost_filesystem-gcc47-mt-d-1_55
-lboost_program_options-gcc47-mt-d-1_55
-lboost_thread-gcc47-mt-d-1_55
-l:libpthread-2.13.so
-lxxxD
-l:libcrypto++.a
-lgcc_s
-lstdc++
-lrt
-lm
-l:libc.so.6
-l:libgcc.a
-l:libc_nonshared.a
-l:ld-linux-x86-64.so.2
/var/chroot/usr/lib/gcc/x86_64-linux-gnu/4.7/crtend.o
/var/chroot/usr/lib/x86_64-linux-gnu/crtn.o
boost库在chroot-ed环境中编译,并作为静态libs生成。我已经设置了gcc/ld标志以按完整路径打印所有链接的内容,实际上所有内容都是从chroot加载的
有人知道会出什么问题吗?我选择的道路可行吗?嗯。。。为什么要使用代码块,而不是简单地在环境中使用chroot和make?Oo我的意思是,如果你说的是交叉编译到windows或ARM或64/32,好吧,但你想要的似乎只是编译到另一个具有其他lib版本的发行版…因为项目已经在代码块中设置好了,如果出现问题,你希望能够在那里调试它。但不幸的是,我无法从代码块导出makefile,而且我真的不知道如何从头开始编写(我认为这会很耗时)。这是一个丑陋的黑客,它使用代码块(在主机上)编译所有对象文件,并仅在chroot环境中运行link命令。不要。。。曾经自己编写一个makefile(非常小的个人项目除外)。。。有一些工具可以达到这个目的,比如伟大的cmake。你想调试一个交叉编译的应用程序吗?我希望您知道您不能直接执行此操作:您必须使用远程调试器。(gdb可以很好地处理这个问题,但我不知道C::B如何管理它)。我建议您在尝试这样做之前,先记录一下编译和linux。作为一条规则:当您可以编译本机时,千万不要尝试交叉编译(除非您有一个很好的理由,比如在“嵌入式和慢速芯片”上)不管怎样,看起来要么你忘记了一个库,要么你使用的版本库对你的项目来说太低了,要么它的一个依赖项,呃……为什么你要使用代码块,而不是简单地在你的环境中使用chroot和make?哦,我的意思是,如果你说的是交叉编译到windows或ARM或64/32,好吧,但是你想看到什么ms只是想用其他lib版本编译到另一个发行版…因为项目已经在代码块中设置,如果出现问题,希望能够在那里调试它。但不幸的是,我无法从代码块导出makefile,我真的不知道如何从头开始编写(我认为这会很耗时)。这是一个丑陋的黑客程序,它使用代码块(在主机上)编译所有对象文件,并仅在chroot环境中运行link命令。不要…永远…自己编写makefile(非常小的个人项目除外)…有一些工具可以达到这个目的,比如伟大的cmake。你想调试一个交叉编译的应用程序吗?我希望你知道你不能直接调试:你必须使用远程调试器。(gdb可以很好地使用它,但我不知道C::B如何管理它)。我建议你在尝试这样做之前先记录一下编译和linux。作为一条规则:当你可以编译本机时,千万不要尝试交叉编译(除非你有很好的理由,比如在“嵌入式和慢速芯片”上)无论如何,您可能忘记了一个库,或者您使用的版本库对于您的项目来说太低,或者它的一个依赖项