【问题标题】:CMake "make install" output can't find shared Qt libraries under RedhatCMake“make install”输出在Redhat下找不到共享的Qt库
【发布时间】:2011-11-01 17:46:59
【问题描述】:

我有一个 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”会出错?文件大小相同。

谢谢

【问题讨论】:

    标签: linux qt cmake redhat


    【解决方案1】:

    正如您所注意到的,CMake make install 命令去除了非标准构建路径,以确保可执行文件将使用系统库并在部署它的任何系统上工作。

    您需要将 Qt 安装到标准库文件夹中,或者将该文件夹添加到系统库路径中。

    要执行后者,请在 /etc/ld.so.conf.d 中创建一个文件 qt4.7.conf ,其中包含一行 /usr/local/Trolltech/Qt-4.7.3/lib 。然后运行ldconfig 来构建库缓存。再次运行 ldd 以检查它是否有效。

    【讨论】:

    • 非常感谢。这是一个完美的答案。
    • 我只有一个观察,如果用户没有管理员权限怎么办?他无法在/etc/ld.so.conf.d 目录中创建文件,那么如何通过shell 指定可执行文件可以找到所需库的目录?
    • LD_LIBRARY_PATH 是一种方式。或者,您可以使用 patchelf 设置新的rpath
    【解决方案2】:

    通过@skyhisi 扩展答案(这为我指明了正确的方向),您还可以在命令行上使用-DCMAKE_INSTALL_RPATH_USE_LINK_PATH:BOOL=ON 作为cmake 的参数,或者在CMakeLists.txt 中包含SET(CMAKE_INSTALL_RPATH_USE_LINK_PATH TRUE) 以防止CMake从删除非标准构建路径。

    这是我在 NetBSD 上使用的方法,我遇到了与 @giles123 完全相同的问题;我的一些库位于/usr/pkg/lib,一个非系统库路径。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-10-03
      • 1970-01-01
      • 2017-07-30
      • 2012-09-30
      • 2021-04-12
      • 1970-01-01
      • 1970-01-01
      • 2019-01-13
      相关资源
      最近更新 更多