【问题标题】:Cross compiling QT交叉编译 QT
【发布时间】:2014-03-08 01:06:15
【问题描述】:

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

有谁知道这可能与什么有关?

看起来有些包是用另一个编译器编译的,现在有不匹配的问题?我写到这里了吗?

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

/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

我认为这并不重要,但如果有人想知道我正在为 Freescale iMX51 (Cortex-A8) 构建 QT 5.2.0。

这是我在 make 之前配置 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)

【问题讨论】:

  • 你能解释一下你交叉编译的板、平台和架构吗?
  • @vinayhunachyal,我认为这些事情并不重要,但请查看更新以回答您的问题!
  • 重要的是配置你需要提供类似 -device 例如 linux-rasp-pi-g++ 或 -xplatform linux-g++-mx5x -release 的选项,这是你设备的 mkspeck。也分享一下你是怎么编译qt的?
  • @vinayhunachyal,你是对的。请参阅编辑。

标签: cross-compiling embedded-linux qt5


【解决方案1】:

我正在使用 gcc 4.8.0 为 x86_64 交叉编译 Qt 5.0.2。我注意到与您的构建有一些潜在的相关差异:

在配置期间:

  • 我没有指定-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。

这是我的配置命令(makefile 的一部分):

    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 是根 fs 的顶层,也是 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 需要首先出现在路径上。

【讨论】:

    猜你喜欢
    • 2011-03-13
    • 1970-01-01
    • 1970-01-01
    • 2016-03-26
    • 2023-03-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多