2013-12-19 246 views
2

我使用供应商交叉编译器gcc-4.4.4-glibc-2.11.1-multilib-1.0/arm-fsl-linux-gnueabi交叉编译QT,并在make期间得到以下错误。交叉编译QT

有谁知道这可能与此有关吗?

它看起来像一些包已编译与另一个编译器,现在有错误匹配?我在这方面写了什么?

我应该如何解决这个问题?

/opt/freescale/usr/local/gcc-4.4.4-glibc-2.11.1-multilib-1.0/arm-fsl-linux-gnueabi/bin/arm-fsl-linux-gnueabi-g++ -Wl,-rpath-link,/mnt/freescale/ltib_10.04_gtt/ltib/rootfs/usr/lib -Wl,-O1 -Wl,-rpath,/opt/qt5/lib -o ../../bin/qmlbundle .obj/main.o -L/mnt/freescale/ltib_10.04_gtt/ltib/rootfs/usr/lib -L/home/user/Downloads/qt5/qtdeclarative/lib -lQt5Qml -L/home/user/Downloads/qt5/qtbase/lib -lQt5Network -lQt5Core -lpthread 

.obj/main.o: In function `showHelp()': 
main.cpp:(.text+0x2e0): undefined reference to `std::basic_ostream<char, std::char_traits<char> >& std::__ostream_insert<char, std::char_traits<char> >(std::basic_ostream<char, std::char_traits<char> >&, char const*, int)' 
main.cpp:(.text+0x310): undefined reference to `std::ctype<char>::_M_widen_init() const' 
main.cpp:(.text+0x368): undefined reference to `std::ctype<char>::_M_widen_init() const' 
main.cpp:(.text+0x3a0): undefined reference to `std::basic_ostream<char, std::char_traits<char> >& std::__ostream_insert<char, std::char_traits<char> >(std::basic_ostream<char, std::char_traits<char> >&, char const*, int)' 
main.cpp:(.text+0x3d0): undefined reference to `std::ctype<char>::_M_widen_init() const' 
main.cpp:(.text+0x408): undefined reference to `std::basic_ostream<char, std::char_traits<char> >& std::__ostream_insert<char, std::char_traits<char> >(std::basic_ostream<char, std::char_traits<char> >&, char const*, int)' 
main.cpp:(.text+0x438): undefined reference to `std::ctype<char>::_M_widen_init() const' 
main.cpp:(.text+0x470): undefined reference to `std::basic_ostream<char, std::char_traits<char> >& std::__ostream_insert<char, std::char_traits<char> >(std::basic_ostream<char, std::char_traits<char> >&, char const*, int)' 
main.cpp:(.text+0x4a0): undefined reference to `std::ctype<char>::_M_widen_init() const' 
main.cpp:(.text+0x4d8): undefined reference to `std::basic_ostream<char, std::char_traits<char> >& std::__ostream_insert<char, std::char_traits<char> >(std::basic_ostream<char, std::char_traits<char> >&, char const*, int)' 
main.cpp:(.text+0x508): undefined reference to `std::ctype<char>::_M_widen_init() const' 
main.cpp:(.text+0x540): undefined reference to `std::basic_ostream<char, std::char_traits<char> >& std::__ostream_insert<char, std::char_traits<char> >(std::basic_ostream<char, std::char_traits<char> >&, char const*, int)' 
main.cpp:(.text+0x570): undefined reference to `std::ctype<char>::_M_widen_init() const' 
main.cpp:(.text+0x5a8): undefined reference to `std::basic_ostream<char, std::char_traits<char> >& std::__ostream_insert<char, std::char_traits<char> >(std::basic_ostream<char, std::char_traits<char> >&, char const*, int)' 
main.cpp:(.text+0x5d8): undefined reference to `std::ctype<char>::_M_widen_init() const' 
main.cpp:(.text+0x610): undefined reference to `std::basic_ostream<char, std::char_traits<char> >& std::__ostream_insert<char, std::char_traits<char> >(std::basic_ostream<char, std::char_traits<char> >&, char const*, int)' 
main.cpp:(.text+0x640): undefined reference to `std::ctype<char>::_M_widen_init() const' 
main.cpp:(.text+0x678): undefined reference to `std::basic_ostream<char, std::char_traits<char> >& std::__ostream_insert<char, std::char_traits<char> >(std::basic_ostream<char, std::char_traits<char> >&, char const*, int)' 
main.cpp:(.text+0x6a8): undefined reference to `std::ctype<char>::_M_widen_init() const' 
main.cpp:(.text+0x700): undefined reference to `std::ctype<char>::_M_widen_init() const' 
main.cpp:(.text+0x738): undefined reference to `std::basic_ostream<char, std::char_traits<char> >& std::__ostream_insert<char, std::char_traits<char> >(std::basic_ostream<char, std::char_traits<char> >&, char const*, int)' 
main.cpp:(.text+0x768): undefined reference to `std::ctype<char>::_M_widen_init() const' 
.obj/main.o: In function `usage(QString const&, QString const&)': 
main.cpp:(.text+0x834): undefined reference to `std::basic_ostream<char, std::char_traits<char> >& std::__ostream_insert<char, std::char_traits<char> >(std::basic_ostream<char, std::char_traits<char> >&, char const*, int)' 
main.cpp:(.text+0x868): undefined reference to `std::ctype<char>::_M_widen_init() const' 
main.cpp:(.text+0x8c0): undefined reference to `std::ctype<char>::_M_widen_init() const' 
main.cpp:(.text+0xa78): undefined reference to `std::basic_ostream<char, std::char_traits<char> >& std::__ostream_insert<char, std::char_traits<char> >(std::basic_ostream<char, std::char_traits<char> >&, char const*, int)' 
main.cpp:(.text+0xaa8): undefined reference to `std::ctype<char>::_M_widen_init() const' 
.obj/main.o: In function `main': 
main.cpp:(.text+0x1ebc): undefined reference to `std::basic_ostream<char, std::char_traits<char> >& std::__ostream_insert<char, std::char_traits<char> >(std::basic_ostream<char, std::char_traits<char> >&, char const*, int)' 
main.cpp:(.text+0x1ef4): undefined reference to `std::ctype<char>::_M_widen_init() const' 
collect2: ld returned 1 exit status 
make[3]: *** [../../bin/qmlbundle] Error 1 

,我不认为它很重要,但如果你想知道我建立QT 5.2.0飞思卡尔iMX51(Cortex-A8的)。

这是我怎么化妆之前配置QT 5.2.0:

./configure -v -opensource -confirm-license -opengl es2 -make libs -device imx5 \ 
-nomake examples -nomake tests \ 
-skip qtsvg -skip qtdeclarative -skip qtwebkit -skip qtconnectivity -skip qtmultimedia -skip qtlocation -skip qtactiveqt -qt-freetype -no-openssl -no-nis -no-pch -no-dbus \ 
-skip qtmacextras -skip qtsensors -skip qtserialport \ 
-device-option CROSS_COMPILE=/opt/freescale/usr/local/gcc-4.4.4-glibc-2.11.1-multilib-1.0/arm-fsl-linux-gnueabi/bin/arm-fsl-linux-gnueabi- \ 
-sysroot /mnt/freescale/ltib_10.04_gtt/ltib/rootfs -no-gcc-sysroot \ 
-prefix /opt/qt5 

为imx5的qmake.conf真正下载,它的内容如下所示:

include(../common/linux_device_pre.conf) 

EGLFS_PLATFORM_HOOKS_SOURCES = $$PWD/qeglfshooks_imx5.cpp 

QMAKE_INCDIR   += $$[QT_SYSROOT]/usr/include 
QMAKE_LIBDIR   += $$[QT_SYSROOT]/usr/lib 

QMAKE_LIBS_EGL   += -lEGL 
QMAKE_LIBS_OPENGL_ES2 += -lGLESv2 -lEGL 
QMAKE_LIBS_OPENVG  += -lOpenVG -lEGL 

QMAKE_LFLAGS   += -Wl,-rpath-link,$$[QT_SYSROOT]/usr/lib 

IMX5_CFLAGS    = -march=armv7-a -mfpu=neon -D_LINUX 
IMX5_CFLAGS_RELEASE  = -O2 $$IMX5_CFLAGS 
QMAKE_CFLAGS_RELEASE += $$IMX5_CFLAGS_RELEASE 
QMAKE_CXXFLAGS_RELEASE += $$IMX5_CFLAGS_RELEASE 
QMAKE_CFLAGS_DEBUG  += $$IMX5_CFLAGS 
QMAKE_CXXFLAGS_DEBUG += $$IMX5_CFLAGS 

include(../common/linux_device_post.conf) 

load(qt_config) 
+0

你能解释一下哪个主板,平台和架构交叉编译? –

+0

@vinayhunachyal,我不认为这些事情应该重要,但看到更新回答你的问题! – theAlse

+0

重要的是你需要提供像-device < >这样的选项,例如linux-rasp-pi-g ++或-xplatform linux-g ++ -mx5x -release,它是你的设备的mkspeck。还分享你如何编译qt? –

回答

0

我交 - 编译Qt 5.0.2 for x86_64,使用gcc 4.8.0。我注意到,从您的构建一些潜在的相关差异:

期间配置:

  • 我不指定-no-gcc-sysroot
  • 我指定-device-option TOOL_DIR=$(TOOL_DIR),其中TOOL_DIR是工具链的顶级目录(即我的cross-g ++在$(TOOL_DIR)/bin/)。这在我的qmake.conf中使用。
  • 我使用-platform参数(尽管我认为这默认为linux-g++-64)。

在我qmake.conf:

  • 我指定QMAKE_INCDIR = $${TOOL_DIR}/include $$[QT_SYSROOT]/usr/include
  • 我不包括linux_device_post.conf,作为该文件的内容都与我无关,除了呼叫deviceSanityCheckCompiler,这我添加到qmake.conf。

这里是我的配置命令(生成文件的一部分):

cd $(QT_DIR) && PATH=$(QT_PATH) ./configure -v \ 
     -prefix $(ROOT_DIR) \ 
     -sysroot $(ROOT_DIR) \ 
     -headerdir $(TOOL_DIR)/include \ 
     -hostprefix $(TOOL_DIR) \ 
     -datadir $(TOOL_DIR) \ 
     -examplesdir $(TOOL_DIR) \ 
     -testsdir $(TOOL_DIR) \ 
     -platform linux-g++-64 \ 
     -device linux-vendorname-g++ \ 
     -device-option CROSS_COMPILE=$(TARGET)- \ 
     -device-option TOOL_DIR=$(TOOL_DIR) \ 
     -opensource \ 
     -confirm-license \ 
     -no-accessibility \ 
     -no-javascript-jit \ 
     -no-gui \ 
     -no-widgets \ 
     -no-gif \ 
     -no-libpng \ 
     -no-libjpeg \ 
     -no-openssl \ 
     -no-xcb \ 
     -no-opengl \ 
     -no-glib \ 
     -no-dbus \ 
     -no-cups \ 
     -no-pkg-config \ 
     -optimized-qmake \ 
     -reduce-relocations \ 
     -reduce-exports \ 
     -release \ 
     -make libs \ 
     -no-pch 

ROOT_DIR是根文件系统的顶层,并且是Qt库将得到安装。

QT_DIR是顶级Qt源代码目录(以及发生Qt构建的位置)。

QT_PATH包括$(TOOL_DIR)/bin,以确保它能找到我的交叉编译器。

这里是我的qmake.conf:

include(../common/linux_device_pre.conf) 

COMPILER_FLAGS   = -mtune=core-avx-i 

#modifications to gcc-base.conf 
QMAKE_CFLAGS  += $$COMPILER_FLAGS 
QMAKE_CXXFLAGS  += $$COMPILER_FLAGS 

#QMAKE_LFLAGS  = 

QMAKE_INCDIR   = $${TOOL_DIR}/include $$[QT_SYSROOT]/usr/include 

QMAKE_CXXFLAGS_CXX11 = -std=c++11 

# Sanity check 
deviceSanityCheckCompiler() 

load(qt_config) 

此外,它看起来像您有联建反对这个版本的Qt的应用问题,而不是在构建Qt本身,是否正确?在那种情况下,如果你还没有,你应该调用你为你的工具链构建的qmake(它应该是一个主机可执行文件)。如果你使用cmake,那么当你找到Qt时,这个qmake需要先在路径上。