2011-11-01 16 views
2

我有一个使用CMake配置和构建的Qt项目。当我只是输入“make”来构建应用程序时,它会在我的构建目录中创建一个应用程序,并且一切正常。但是,当我键入“make install”安装到发布目录时,生成的可执行文件将无法运行,因为它找不到共享库。我收到一个错误消息:CMake“make install”输出无法在Redhat下找到共享的Qt库

release/testapp: error while loading shared libraries: libQtGui.so.4: cannot open shared  object file: No such file or directory 

什么是“make install”对可执行文件执行的操作?我认为它只是复制它必须对文件做些什么的文件。我试图从同一个终端执行这两个文件,所以我的环境是一样的。

这里是LDD上的可执行的输出版本目录(从产生“使安装”):

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) 

而如果我在build目录(从创建的可执行文件运行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”会给出错误?这些文件都是相同的大小。

感谢

回答

5

正如你已经注意到,CMake的make install命令,会剥离掉非标订做的路径,以确保可执行文件将使用系统库和工作它部署在任何系统上。

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

要做后者,创建一个文件qt4.7.conf/etc/ld.so.conf.d与一行/usr/local/Trolltech/Qt-4.7.3/lib。然后运行ldconfig来构建库缓存。再次运行ldd以检查此功能是否有效。

+0

非常感谢。这是一个完美的答案。 – giles123

+0

我只有观察,如果用户没有管理权限会怎么样?他不能在'/etc/ld.so.conf.d'目录下创建一个文件,那么如何才能通过shell指定一个目录,其中可执行文件可以找到所需的库? – linello

+0

[LD_LIBRARY_PATH](http://tldp.org/HOWTO/Program-Library-HOWTO/shared-libraries.html#AEN80)是一种方法。或者,你可以使用patchelf来设置一个新的'rpath'。 –

2

通过@skyhisi的答案扩大(这是我指出了正确的方向),你也可以使用-DCMAKE_INSTALL_RPATH_USE_LINK_PATH:BOOL=ON作为参数传递给cmake在命令行上或包括在SET(CMAKE_INSTALL_RPATH_USE_LINK_PATH TRUE)CMakeLists.txt CMake的防止从消除非标订做路径。

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