cpack找不到库,此目录中不存在目标

ant*_*009 11 c cmake cpack

EDIT ===================
Run Code Online (Sandbox Code Playgroud)

apr-1是apache可移植运行时,我自己下载并编译以创建共享库(因此它不是由cmake创建的).在目标系统上运行CPack后,我需要链接到这个库.

我的开发项目目录:

read_config/bin
           /libs
           /include
           /src
           /build
Run Code Online (Sandbox Code Playgroud)

对于我的CMakeLists.txt,一切安装正常,但现在我有一个链接问题,因为它找不到库的新位置.

我已经删除了,LINK_DIRECTORIES(${PROJECT_SOURCE_DIR}/libs)因为我现在不需要这个,因为我正在使用FIND_LIBRARY.

并添加了以下内容:

# Find the library in the libs folder
FIND_LIBRARY(APR_LIBS NAMES "apr-1" PATHS ${PROJECT_SOURCE_DIR}/libs)
# Print out the path to see if its correct
MESSAGE(${APR_LIBS})
# Link the library with the executable
TARGET_LINK_LIBRARIES(cfg ${APR_LIBS})

# Install the libs folder
INSTALL(DIRECTORY ${PROJECT_SOURCE_DIR}/libs/
    DESTINATION libs)

# Install the executable in the bin folder
INSTALL(TARGETS cfg 
    RUNTIME DESTINATION bin)
Run Code Online (Sandbox Code Playgroud)

一切都安装正常,但是当我检查可执行文件以查看它链接的库时,它找不到apr-1它在错误的地方看起来.

libapr-1.so.0 => not found
Run Code Online (Sandbox Code Playgroud)

这是因为我已将安装包解压缩到一个新位置,该位置与编译它的位置不同.从编译目录我得到这个,运行正常:

libapr-1.so.0 => /home/devel/projects/read_config/libs/libapr-1.so.0 (0xf7746000)
Run Code Online (Sandbox Code Playgroud)

我安装后,我在目标安装机器上有这个目录结构,因此可执行文件将链接到新libs/apr-1库:

target directory/
      /bin
      /libs/apr-1
Run Code Online (Sandbox Code Playgroud)

非常感谢任何进一步的建议,

========================================
Run Code Online (Sandbox Code Playgroud)

gcc(GCC)4.7.2 cmake版本2.8.9 Fedora 17

你好,

我遇到以下错误:

CMake Error at src/CMakeLists.txt:14 (INSTALL):
  install TARGETS given target "apr-1" which does not exist in this
  directory.
Run Code Online (Sandbox Code Playgroud)

我有以下目录:

read_config/
       /build - out of source build
       /CMakeLists.txt
       /include - apr include files
       /libs - apr libraries
       /src - project source files *.h *.c CMakeLists.txt
Run Code Online (Sandbox Code Playgroud)

在我的根CMakeLists.txt中,我有以下内容:

# Name of project and compiler to use
PROJECT(read_cfg C)

# Set compiler flags
IF(CMAKE_COMPILER_IS_GNUCC)
    MESSAGE(STATUS "COMPILER IS GNUCC")
    SET(CMAKE_C_FLAGS "-Wall -Wextra -m32 -Wunreachable-code -ggdb -O0 -D_DEBUG -D_LARGEFILE64_SOURCE")
ENDIF(CMAKE_COMPILER_IS_GNUCC)

# Where the include files can be found
INCLUDE_DIRECTORIES(${CMAKE_SOURCE_DIR}/read_config/include)

# Where the libraries can be found
LINK_DIRECTORIES(${CMAKE_SOURCE_DIR}/read_config/libs)

ADD_SUBDIRECTORY(src)
Run Code Online (Sandbox Code Playgroud)

在我的src目录中,我有以下CMakeLists.txt

# Create the executable and link the libraries into it
ADD_EXECUTABLE(cfg test_config.c)

# Place executable in bin directory
SET(EXECUTABLE_OUTPUT_PATH ${CMAKE_SOURCE_DIR}/bin)

# Add libraries
IF(CMAKE_COMPILER_IS_GNUCC)
  MESSAGE(STATUS "Linking cfg library")
  TARGET_LINK_LIBRARIES(cfg apr-1)
ENDIF(CMAKE_COMPILER_IS_GNUCC)

INSTALL(TARGETS cfg 
    RUNTIME 
    DESTINATION bin)
INSTALL(TARGETS apr-1 
    ARCHIVE 
    DESTINATION lib)

SET(CPACK_PACKAGE_NAME "rd_cfg")
SET(CPACK_PACKAGE_VENDOR "sun.com")
SET(CPACK_PACKAGE_DESCRIPTION_SUMMARY "rd_cfg - CPack read_config installation")
SET(CPACK_PACKAGE_VERSION "1.0.0")
SET(CPACK_PACKAGE_VERSION_MAJOR "1")
SET(CPACK_PACKAGE_VERSION_MINOR "0")
SET(CPACK_PACKAGE_VERSION_PATCH "0")
SET(CPACK_PACKAGE_INSTALL_DIRECTORY "Read_config_install_dir")

INCLUDE(CPack)
Run Code Online (Sandbox Code Playgroud)

问题是这一行:

INSTALL(TARGETS apr-1 
    ARCHIVE 
    DESTINATION lib)
Run Code Online (Sandbox Code Playgroud)

我尝试过以下操作

INSTALL(TARGETS ${CMAKE_SOURCE_DIR}/libs/apr-1 
    ARCHIVE 
    DESTINATION lib)
Run Code Online (Sandbox Code Playgroud)

但它仍然无法找到图书馆.

并使用这样的路径:

INSTALL(TARGETS src/libs 
    ARCHIVE 
    DESTINATION lib)
Run Code Online (Sandbox Code Playgroud)

我希望能够像这样把目录放在那里,所以我不必指定每个库,只是像这样的目录:

INSTALL(TARGETS ${CMAKE_SOURCE_DIR}/libs 
    ARCHIVE 
    DESTINATION lib)
Run Code Online (Sandbox Code Playgroud)

所以它可以找到该目录中的所有库.我有大约5个.

非常感谢任何建议,

Fra*_*ser 5

该错误似乎是通过调用install不同的CMakeLists.txt来apr-1定义的add_library.

我猜你add_library(apr-1 ...)在你的根CMakeLists.txt中做了,这意味着你需要打电话install(TARGETS apr-1 ARCHIVE DESTINATION lib).

请注意,此目录中不存在错误消息"...".不是指文件系统意义上的实际目录,而是指通过add_subdirectory命令产生的名义目录.

编辑

根据您的评论,问题似乎apr-1不是一个真正的CMake目标,而只是一个库.

在这种情况下,install命令不能是TARGETS版本,它必须是install(FILES...)install(DIRECTORY...).这可能意味着您必须使用例如找到库find_library以获得完整路径.

进一步编辑

这个进一步的问题是由于没有设置正确的RPATH标志.您需要在调用之前将以下行添加到src/CMakeLists.txt ADD_EXECUTABLE:

SET(CMAKE_SKIP_BUILD_RPATH FALSE)
SET(CMAKE_BUILD_WITH_INSTALL_RPATH FALSE) 
SET(CMAKE_INSTALL_RPATH "${CMAKE_INSTALL_PREFIX}/libs")
SET(CMAKE_INSTALL_RPATH_USE_LINK_PATH TRUE)
LIST(FIND CMAKE_PLATFORM_IMPLICIT_LINK_DIRECTORIES "${CMAKE_INSTALL_PREFIX}/libs" isSystemDir)
IF("${isSystemDir}" STREQUAL "-1")
   SET(CMAKE_INSTALL_RPATH "${CMAKE_INSTALL_PREFIX}/libs")
ENDIF("${isSystemDir}" STREQUAL "-1")
Run Code Online (Sandbox Code Playgroud)

有关这些CMake变量的完整说明,请参阅有关RPATH处理的CMake Wiki