我有一个 Qt 项目,我正在使用 CMake 配置和构建它。当我只输入“make”来构建应用程序时,它会在我的构建目录中创建一个应用程序并且一切正常。但是,当我键入“make install”以安装到发布目录时,生成的可执行文件不会运行,因为它找不到共享库。我收到一条错误消息:
release/testapp: error while loading shared libraries: libQtGui.so.4: cannot open shared object file: No such file or directory
“make install”对可执行文件做了什么?我认为它只会复制文件,它必须对文件执行某些操作。我试图从同一个终端执行这两个文件,所以我的环境是一样的。
这是发布目录中可执行文件的 ldd 输出(从“make install”生成):
libQtGui.so.4 => not found
libQtCore.so.4 => not found
libstdc++.so.6 => /usr/lib/libstdc++.so.6 (0x00906000)
libm.so.6 => /lib/tls/libm.so.6 (0x00695000)
libgcc_s.so.1 => /lib/libgcc_s.so.1 (0x008fa000)
libc.so.6 => /lib/tls/libc.so.6 (0x00567000)
/lib/ld-linux.so.2 (0x00548000)
而如果我在构建目录(从“make”创建)中的可执行文件上运行 ldd,它会输出以下内容:
libQtGui.so.4 => /usr/local/Trolltech/Qt-4.7.3/lib/libQtGui.so.4 (0x00560000)
libQtCore.so.4 => /usr/local/Trolltech/Qt-4.7.3/lib/libQtCore.so.4 (0x00111000)
libstdc++.so.6 => /usr/lib/libstdc++.so.6 (0x003ec000)
libm.so.6 => /lib/tls/libm.so.6 (0x004b7000)
libgcc_s.so.1 => /lib/libgcc_s.so.1 (0x004da000)
libc.so.6 => /lib/tls/libc.so.6 (0x033fe000)
libpthread.so.0 => /lib/tls/libpthread.so.0 (0x004e4000)
libgthread-2.0.so.0 => /usr/lib/libgthread-2.0.so.0 (0x004f6000)
libglib-2.0.so.0 => /usr/lib/libglib-2.0.so.0 (0x02e76000)
libpng12.so.0 => /usr/lib/libpng12.so.0 (0x004fa000)
libz.so.1 => /usr/lib/libz.so.1 (0x0051e000)
libfreetype.so.6 => /usr/lib/libfreetype.so.6 (0x02df6000)
libSM.so.6 => /usr/X11R6/lib/libSM.so.6 (0x0052e000)
libICE.so.6 => /usr/X11R6/lib/libICE.so.6 (0x022ac000)
libXrender.so.1 => /usr/X11R6/lib/libXrender.so.1 (0x00537000)
libfontconfig.so.1 => /usr/lib/libfontconfig.so.1 (0x02442000)
libXext.so.6 => /usr/X11R6/lib/libXext.so.6 (0x0218a000)
libX11.so.6 => /usr/X11R6/lib/libX11.so.6 (0x03937000)
libdl.so.2 => /lib/libdl.so.2 (0x0053f000)
librt.so.1 => /lib/tls/librt.so.1 (0x02238000)
/lib/ld-linux.so.2 (0x00548000)
libexpat.so.0 => /usr/lib/libexpat.so.0 (0x02377000)
这是用于创建这些文件的 CMakeLists.txt 文件:
#CMakeLists.txt
cmake_minimum_required(VERSION 2.8)
project(testapp)
set(CMAKE_VERBOSE_MAKEFILE OFF)
find_package(Qt4 REQUIRED)
set (CMAKE_C_FLAGS "-m32 -g")
set (CMAKE_CXX_FLAGS "-m32 -g")
set (CMAKE_INSTALL_PREFIX release)
set(PROGNAME testapp)
add_definitions(-Wall)
set(testapp_SRCS
main.cpp
testapp.cpp
)
set(testapp_MOC_HDRS
testapp.h
)
set(QT_USE_QTGUI TRUE)
include(${QT_USE_FILE})
include_directories(
${CMAKE_CURRENT_BINARY_DIR}
${CMAKE_CURRENT_SOURCE_DIR}
)
qt4_wrap_cpp(testapp_MOC_SRCS ${testapp_MOC_HDRS})
add_executable(${PROGNAME}
${testapp_SRCS}
${testapp_MOC_SRCS}
)
target_link_libraries(${PROGNAME}
${QT_LIBRARIES}
)
install(TARGETS ${PROGNAME} DESTINATION .)
这可能只是一些愚蠢的事情,但为什么“make”的可执行文件可以工作但“make install”会出错?这两个文件的大小相同。
谢谢
最佳答案
正如您所注意到的,CMake make install
命令去除了非标准构建路径,以确保可执行文件将使用系统库并在其部署的任何系统上运行。
您需要将 Qt 安装到标准库文件夹中,或者将文件夹添加到系统库路径中。
要执行后者,请在 /etc/ld.so.conf.d
中创建一个文件 qt4.7.conf
,其中包含一行 /usr/local/Trolltech/Qt-4.7.3/lib
。然后运行 ldconfig
来构建库缓存。再次运行 ldd
以检查是否有效。
关于linux - CMake "make install"输出找不到Redhat下的共享Qt库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7970544/