我有一个使用CMakeconfiguration和构build的Qt项目。 当我只是input“make”来构build应用程序时,它会在我的构build目录中创build一个应用程序,并且工作正常。 但是,当我键入“make install”安装到版本目录时,生成的可执行文件将无法运行,因为它找不到共享库。 我得到一个错误说:
release/testapp: error while loading shared libraries: libQtGui.so.4: cannot open shared object file: No such file or directory
什么是“make install”可执行文件? 我认为这只是复制文件,它必须做的东西到文件。 我试图从同一个terminal执行这两个文件,所以我的环境是一样的。
下面是发行版目录中的可执行文件(由“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)
而如果我在生成目录(由“make”创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)
这是用于创build这些文件的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”的可执行文件工作,但“安装”给出错误? 这些文件都是相同的大小。
谢谢
正如你已经注意到的,CMake make install
命令剥离非标准的构建路径,以确保可执行文件将使用系统库,并在其部署的任何系统上工作。
您需要将Qt安装到标准库文件夹中,或将该文件夹添加到系统库路径中。
要做到后者,用/usr/local/Trolltech/Qt-4.7.3/lib
一行在/etc/ld.so.conf.d
创建一个文件qt4.7.conf
。 然后运行ldconfig
来建立库缓存。 再次运行ldd
来检查这个工作。
在@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
,非系统库路径。