QMake:如何选择库版本到link
QMake: how to choose version of library to link to
有一个使用 OpenCV 的简单计算机视觉应用程序。我在主机系统上编译它而不是部署到 NVidia Jetson TK1(这里没问题,我使用 Qt Creator 和配置的工具包)。我使用 sshfs
将 Jetson 的文件系统根目录挂载到主机 /mnt/sysroot_tegra_tk1
。
问题:我刚刚在 Jetson 上编译了 OpenCV 3.2 版(安装到开发板 /usr/local/lib
中)。 /usr/local
还有系统OpenCV version 2.4。我不知道如何在主机系统上配置 qmake 来交叉编译和 link 新版本而不是 Jetson 的系统默认版本。
我的 .pro 文件:
QT += core
QT -= gui
CONFIG += c++11
TARGET = markerExtractionChromakey
CONFIG += console
CONFIG -= app_bundle
unix: INCLUDEPATH += /usr/local/include
unix: QMAKE_LIBDIR = /usr/local/lib
unix: LIBS += -lopencv_imgproc\
-lopencv_core.so\
-lopencv_video\
-lopencv_highgui\
-lopencv_gpu
TEMPLATE = app
HEADERS += cameraworker.h
SOURCES += main.cpp \
cameraworker.cpp
target.path = /home/ubuntu/alan/markerExtractionChromakey
target.files += markerExtractionChromakey
INSTALLS += target
项目link年龄产出:
/usr/bin/arm-linux-gnueabihf-g++ -Wl,-rpath-link,/mnt/sysroot_tegra_tk1/usr/lib
-Wl,-rpath-link,/mnt/sysroot_tegra_tk1/usr/lib/arm-linux-gnueabihf
-Wl,-rpath-link,/mnt/sysroot_tegra_tk1/lib/arm-linux-gnueabihf -mfloat-abi=hard
--sysroot=/mnt/sysroot_tegra_tk1 -Wl,-rpath,/usr/local/qt5/lib
-o markerExtractionChromakey main.o cameraworker.o -L/usr/local/lib
-lopencv_imgproc -lopencv_core -lopencv_video -lopencv_highgui
-lopencv_gpu -L/opt/qt5_for_tegra/qt-everywhere-opensource-src-5.5.1/qtbase/lib
-lQt5Core -L/mnt/sysroot_tegra_tk1/usr/lib
-L/mnt/sysroot_tegra_tk1/lib/arm-linux-gnueabihf
-L/mnt/sysroot_tegra_tk1/usr/lib/arm-linux-gnueabihf -lpthread
问题已解决。关键时刻:
- 放置在不同位置的不同版本(使用显式 soname 是一个选项,但在我的例子中,库放置在链接器默认范围之外)。
- 必须有正确的
-rpath/-rpath-link
来告诉链接器在哪里寻找。
<path to Qt>/qt-everywhere-opensource-src-5.5.1/qtbase/mkspecs/devices/linux-jetson-tk1-g++/qmake.conf
中指定的 Jetson 默认 -rpath
位置。只需在默认目录之前添加您的目录:
QMAKE_INCDIR += \
$$[QT_SYSROOT]/usr/local/include \
$$[QT_SYSROOT]/usr/include \
$$[QT_SYSROOT]/usr/include/arm-linux-gnueabihf
QMAKE_LIBDIR += \
$$[QT_SYSROOT]/usr/local/lib \
$$[QT_SYSROOT]/usr/lib \
$$[QT_SYSROOT]/lib/arm-linux-gnueabihf \
$$[QT_SYSROOT]/usr/lib/arm-linux-gnueabihf
QMAKE_LFLAGS += \
-Wl,-rpath-link,$$[QT_SYSROOT]/usr/local/lib \
-Wl,-rpath-link,$$[QT_SYSROOT]/usr/lib \
-Wl,-rpath-link,$$[QT_SYSROOT]/usr/lib/arm-linux-gnueabihf \
-Wl,-rpath-link,$$[QT_SYSROOT]/lib/arm-linux-gnueabihf
有一个使用 OpenCV 的简单计算机视觉应用程序。我在主机系统上编译它而不是部署到 NVidia Jetson TK1(这里没问题,我使用 Qt Creator 和配置的工具包)。我使用 sshfs
将 Jetson 的文件系统根目录挂载到主机 /mnt/sysroot_tegra_tk1
。
问题:我刚刚在 Jetson 上编译了 OpenCV 3.2 版(安装到开发板 /usr/local/lib
中)。 /usr/local
还有系统OpenCV version 2.4。我不知道如何在主机系统上配置 qmake 来交叉编译和 link 新版本而不是 Jetson 的系统默认版本。
我的 .pro 文件:
QT += core
QT -= gui
CONFIG += c++11
TARGET = markerExtractionChromakey
CONFIG += console
CONFIG -= app_bundle
unix: INCLUDEPATH += /usr/local/include
unix: QMAKE_LIBDIR = /usr/local/lib
unix: LIBS += -lopencv_imgproc\
-lopencv_core.so\
-lopencv_video\
-lopencv_highgui\
-lopencv_gpu
TEMPLATE = app
HEADERS += cameraworker.h
SOURCES += main.cpp \
cameraworker.cpp
target.path = /home/ubuntu/alan/markerExtractionChromakey
target.files += markerExtractionChromakey
INSTALLS += target
项目link年龄产出:
/usr/bin/arm-linux-gnueabihf-g++ -Wl,-rpath-link,/mnt/sysroot_tegra_tk1/usr/lib
-Wl,-rpath-link,/mnt/sysroot_tegra_tk1/usr/lib/arm-linux-gnueabihf
-Wl,-rpath-link,/mnt/sysroot_tegra_tk1/lib/arm-linux-gnueabihf -mfloat-abi=hard
--sysroot=/mnt/sysroot_tegra_tk1 -Wl,-rpath,/usr/local/qt5/lib
-o markerExtractionChromakey main.o cameraworker.o -L/usr/local/lib
-lopencv_imgproc -lopencv_core -lopencv_video -lopencv_highgui
-lopencv_gpu -L/opt/qt5_for_tegra/qt-everywhere-opensource-src-5.5.1/qtbase/lib
-lQt5Core -L/mnt/sysroot_tegra_tk1/usr/lib
-L/mnt/sysroot_tegra_tk1/lib/arm-linux-gnueabihf
-L/mnt/sysroot_tegra_tk1/usr/lib/arm-linux-gnueabihf -lpthread
问题已解决。关键时刻:
- 放置在不同位置的不同版本(使用显式 soname 是一个选项,但在我的例子中,库放置在链接器默认范围之外)。
- 必须有正确的
-rpath/-rpath-link
来告诉链接器在哪里寻找。 <path to Qt>/qt-everywhere-opensource-src-5.5.1/qtbase/mkspecs/devices/linux-jetson-tk1-g++/qmake.conf
中指定的 Jetson 默认-rpath
位置。只需在默认目录之前添加您的目录:QMAKE_INCDIR += \ $$[QT_SYSROOT]/usr/local/include \ $$[QT_SYSROOT]/usr/include \ $$[QT_SYSROOT]/usr/include/arm-linux-gnueabihf QMAKE_LIBDIR += \ $$[QT_SYSROOT]/usr/local/lib \ $$[QT_SYSROOT]/usr/lib \ $$[QT_SYSROOT]/lib/arm-linux-gnueabihf \ $$[QT_SYSROOT]/usr/lib/arm-linux-gnueabihf QMAKE_LFLAGS += \ -Wl,-rpath-link,$$[QT_SYSROOT]/usr/local/lib \ -Wl,-rpath-link,$$[QT_SYSROOT]/usr/lib \ -Wl,-rpath-link,$$[QT_SYSROOT]/usr/lib/arm-linux-gnueabihf \ -Wl,-rpath-link,$$[QT_SYSROOT]/lib/arm-linux-gnueabihf