c++ - 在 m64 autotools 项目中编译 m32 库

标签 c++ cross-compiling autotools

我正在创建一个 m64 Autotools C++ 项目。主程序编译良好。但是,我的一小部分代码需要编译一个 32 位库(不会被我的主程序使用)。设置如下

lib_LTLIBRARIES = $(top_builddir)/lib/libabc.la

__top_builddir__lib_libabc_la_LDFLAGS = -version-info 1:0:0 -m32 


__top_builddir__lib_libabc_la_SOURCES = \
        abc.cc

AM_CXXFLAGS = -m32

endif

当我编译项目时,它给出了两种类型的错误。首先,即使我安装了 gcc-multilib 和 g++-multilib,链接器也不会搜索 32 位库。我可以通过添加 -L 选项让链接器搜索 32 位库来解决这个问题。但是这种解决方案损害了可移植性。其次,Autotools 增加了几个 64 位输入对象,例如 crti.o,这导致编译错误。完整的错误输出在这里

libtool: link: g++  -fPIC -DPIC -shared -nostdlib /usr/lib/gcc/x86_64-linux-
    gnu/4.8/../../../x86_64-linux-gnu/crti.o /usr/lib/gcc/x86_64-linux-
    gnu/4.8/crtbeginS.o  .libs/abc.o   -L/usr/lib/gcc/x86_64-linux-gnu/4.8 -
    L/usr/lib/gcc/x86_64-linux-gnu/4.8/../../../x86_64-linux-gnu -
    L/usr/lib/gcc/x86_64-linux-gnu/4.8/../../../../lib -L/lib/x86_64-linux-gnu -
    L/lib/../lib -L/usr/lib/x86_64-linux-gnu -L/usr/lib/../lib -
    L/usr/lib/gcc/x86_64-linux-gnu/4.8/../../.. -lstdc++ -lm -lc -lgcc_s 
    /usr/lib/gcc/x86_64-linux-gnu/4.8/crtendS.o /usr/lib/gcc/x86_64-linux-
    gnu/4.8/../../../x86_64-linux-gnu/crtn.o  -m32 -msse2 -O0 -m32   -Wl,-soname -
    Wl,libabc.so.1 -o ../../lib/.libs/libabc.so.1.0.0
/usr/bin/ld: skipping incompatible /usr/lib/gcc/x86_64-linux-gnu/4.8/libstdc++.so when searching for -lstdc++
/usr/bin/ld: skipping incompatible /usr/lib/gcc/x86_64-linux-gnu/4.8/libstdc++.a when searching for -lstdc++
/usr/bin/ld: skipping incompatible /usr/lib/gcc/x86_64-linux-gnu/4.8/../../../x86_64-linux-gnu/libm.so when searching for -lm
/usr/bin/ld: skipping incompatible /usr/lib/gcc/x86_64-linux-gnu/4.8/../../../x86_64-linux-gnu/libm.a when searching for -lm
/usr/bin/ld: skipping incompatible /usr/lib/x86_64-linux-gnu/libm.so when searching for -lm
/usr/bin/ld: skipping incompatible /usr/lib/x86_64-linux-gnu/libm.a when searching for -lm
/usr/bin/ld: skipping incompatible /usr/lib/gcc/x86_64-linux-gnu/4.8/../../../x86_64-linux-gnu/libc.so when searching for -lc
/usr/bin/ld: skipping incompatible /usr/lib/gcc/x86_64-linux-gnu/4.8/../../../x86_64-linux-gnu/libc.a when searching for -lc
/usr/bin/ld: skipping incompatible /usr/lib/x86_64-linux-gnu/libc.so when searching for -lc
/usr/bin/ld: skipping incompatible /usr/lib/x86_64-linux-gnu/libc.a when searching for -lc
/usr/bin/ld: skipping incompatible /usr/lib/gcc/x86_64-linux-gnu/4.8/libgcc_s.so when searching for -lgcc_s
/usr/bin/ld: i386:x86-64 architecture of input file `/usr/lib/gcc/x86_64-linux-gnu/4.8/../../../x86_64-linux-gnu/crti.o' is incompatible with i386 output
/usr/bin/ld: i386:x86-64 architecture of input file `/usr/lib/gcc/x86_64-linux-gnu/4.8/crtbeginS.o' is incompatible with i386 output
/usr/bin/ld: i386:x86-64 architecture of input file `/usr/lib/gcc/x86_64-linux-gnu/4.8/crtendS.o' is incompatible with i386 output
/usr/bin/ld: i386:x86-64 architecture of input file `/usr/lib/gcc/x86_64-linux-gnu/4.8/../../../x86_64-linux-gnu/crtn.o' is incompatible with i386 output
collect2: error: ld returned 1 exit status

知道如何使用适当的 32 位系统库编译这个 32 位库吗?

最佳答案

首先:我认为您需要设置 CFLAGS 而不是 CXXFLAGS。

CFLAGS=-m32

也许没什么,但您是否尝试过在其他标志之前设置 -m32 标志?

其次:您是否尝试过使用 pkg-config ?您需要安装它并配置 PKG_CONFIG_PATH

`pkg-config --libs lib32stdc++`

http://linux.die.net/man/1/pkg-config

对不起我的英语我正在学习

关于c++ - 在 m64 autotools 项目中编译 m32 库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29128043/

相关文章:

c++ - 如何在 C++ 中正确使用用户输入的参数

c++ - 如何使用 Eigen 库计算矩阵幂?

c++ - 狮身人面像 + 氧气 + 呼吸 : How do I get a documentation like the one of Google's Ceres Solver?

compilation - 如何在Windows上的SCons中导出具有备用扩展名的程序

CMake 从 Autoconf 生成 config.h

scheme - 使用自动工具制作可执行的 Guile 程序?

c++ - fatal error : error when reading "C:\OpenSSL-Win32\lib\libeay32.lib": unexpected end-of-file

database - java 7 和 8 之间重载函数的源代码兼容性

c++ - section.data 中错误的 reloc 地址 0x0 python 的 C 扩展

python - 检查configure.ac中AX_PYTHON_MODULE的结果