2013-12-19 245 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需要先在路徑上。