使用 CMake 进行交叉编译:如何排除默认 qt 库而不将它们传递到链接器的命令行

Art*_*tem 5 c++ linux linker qt

我想在 Linux x64 上使用 CMake for ARM 交叉编译 Qt 行星演示应用程序。

我安装了arm交叉编译器。我已经在 ARM 板上构建了 Qt 库,并将它们复制到 x64 Linux 盒子的 /lib/arm-linux-gnueabihf 中。

对于 qmake,我只在planets.pro 文件中添加了几行:

PLATFORM = arm-linux-gnueabihf
QMAKE_CXX = /usr/bin/$$PLATFORM-g++
QMAKE_LINK = /usr/bin/$$PLATFORM-g++
QMAKE_LIBS = -L/usr/$$PLATFORM/lib -L/lib/$$PLATFORM
Run Code Online (Sandbox Code Playgroud)

编译成功,在ARM板上完美运行。

现在,我想使用 CMake 来完成此操作。因此,我创建了以下 CMakeLists.txt:

cmake_minimum_required(VERSION 3.5)

set(PLATFORM arm-linux-gnueabihf)
set(CMAKE_CXX_COMPILER /usr/bin/${PLATFORM}-g++)
link_directories(/usr/${PLATFORM}/lib /lib/${PLATFORM})

file(GLOB_RECURSE HEADERS "*.hpp")
file(GLOB SOURCES "*.cpp")

set(CMAKE_AUTOMOC ON)

find_package(Qt5Qml REQUIRED)
find_package(Qt5Quick REQUIRED)

add_executable(planets-qml ${SOURCES})

target_link_libraries(planets-qml
    Qt5::Qml
    Qt5::Quick
)
Run Code Online (Sandbox Code Playgroud)

这样我在 Qt Creator 的日志中出现以下警告:

Cannot generate a safe runtime search path for target planets-qml because
files in some directories may conflict with libraries in implicit
directories:

runtime library [libGL.so.1] in /usr/lib/x86_64-linux-gnu may be hidden by files in:
  /lib/arm-linux-gnueabihf
Run Code Online (Sandbox Code Playgroud)

然后,我正在构建它,但出现链接器错误:

/home/dev/Qt5.7.0/5.7/gcc_64/lib/libQt5Quick.so.5.7.0: 
file not recognized: File format not recognized
Run Code Online (Sandbox Code Playgroud)

我认为发生这种情况是因为链接器尝试将 x64 Qt 库链接到 ARM 二进制文件。但为什么它无法从 /lib/arm-linux-gnueabihf 找到库?

我在文件 linker.txt 中找到了链接器的命令:

/usr/bin/arm-linux-gnueabihf-g++ 
    CMakeFiles/planets-qml.dir/main.cpp.o 
    CMakeFiles/planets-qml.dir/planets-qml_automoc.cpp.o  
    -o planets-qml  
    -L/usr/arm-linux-gnueabihf/lib  -L/lib/arm-linux-gnueabihf 
    /home/dev/Qt5.7.0/5.7/gcc_64/lib/libQt5Quick.so.5.7.0 
    /home/dev/Qt5.7.0/5.7/gcc_64/lib/libQt5Qml.so.5.7.0 
    /home/dev/Qt5.7.0/5.7/gcc_64/lib/libQt5Network.so.5.7.0 
    /home/dev/Qt5.7.0/5.7/gcc_64/lib/libQt5Gui.so.5.7.0 
    /home/dev/Qt5.7.0/5.7/gcc_64/lib/libQt5Core.so.5.7.0 
    -Wl,-rpath,/usr/arm-linux-gnueabihf/lib:/lib/arm-linux-gnueabihf:/home/dev/Qt5.7.0/5.7/gcc_64/lib 
Run Code Online (Sandbox Code Playgroud)

所以,问题是:如何排除这些 /home/dev/Qt5... 条目而不将它们传递给链接器?我应该在 CMakeLists.txt 文件中使用什么 CMake 命令?

Pno*_*tNP 2

问题是您正在查看错误的 QT 目录。您需要为 ARM 重新编译 Qt。然后在通话Qt5_DIR前设置。find_package

set(Qt5_DIR  <path-to-Qt>/lib/cmake/Qt5/)
Run Code Online (Sandbox Code Playgroud)

你的<path-to-Qt>/lib/cmake/Qt5/应该看起来像这样:

$ ls <path-to-Qt>/lib/cmake/Qt5/
Qt5Config.cmake        Qt5ConfigVersion.cmake 
Run Code Online (Sandbox Code Playgroud)