Cpack не может найти библиотеки, цель не существует в этом каталоге

EDIT ===================

apr-1 - это портативная среда выполнения apache, которую я загрузил и скомпилировал для создания общей библиотеки (поэтому ее не сделал cmake). Мне нужно связать эту библиотеку после запуска CPack в целевой системе.

Моя директория проекта разработки:

read_config/bin
           /libs
           /include
           /src
           /build

Для моего 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)

Все устанавливается нормально, но когда я проверяю исполняемый файл, чтобы увидеть, какие библиотеки он связывает с ним, он не может найти apr-1, поскольку он выглядит не в том месте.

libapr-1.so.0 => not found

Это связано с тем, что я извлек установочный пакет в новое место, которое отличается от того, где он был скомпилирован. Из скомпилированного каталога я получаю это, который работает нормально:

libapr-1.so.0 => /home/devel/projects/read_config/libs/libapr-1.so.0 (0xf7746000)

Я после установки у меня есть эта структура каталогов на целевой установочной машине, поэтому исполняемый файл будет связан с новой библиотекой libs/apr-1:

target directory/
      /bin
      /libs/apr-1

Большое спасибо за любые дальнейшие предложения,

========================================

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.

У меня есть следующий каталог:

read_config/
       /build - out of source build
       /CMakeLists.txt
       /include - apr include files
       /libs - apr libraries
       /src - project source files *.h *.c CMakeLists.txt

В моем корне 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)

В моем каталоге 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)

Проблема заключается в этой строке:

INSTALL(TARGETS apr-1 
    ARCHIVE 
    DESTINATION lib)

Я пробовал сделать следующее

INSTALL(TARGETS ${CMAKE_SOURCE_DIR}/libs/apr-1 
    ARCHIVE 
    DESTINATION lib)

Но он все еще не находит библиотеку.

И также используя следующий путь:

INSTALL(TARGETS src/libs 
    ARCHIVE 
    DESTINATION lib)

Я хотел бы иметь возможность просто разместить каталог таким образом, чтобы мне не нужно было указывать каждую библиотеку, но только каталог, подобный этому:

INSTALL(TARGETS ${CMAKE_SOURCE_DIR}/libs 
    ARCHIVE 
    DESTINATION lib)

Таким образом, он может найти все библиотеки в этом каталоге. У меня их около 5.

Большое спасибо за любые предложения,

Ответ 1

Ошибка, похоже, является результатом вызова 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")

Подробное объяснение этих переменных CMake см. в CMake Wiki в RPATH-обработке

Ответ 2

попробуйте добавить это в свой CMakeLists.txt

set(CMAKE_INSTALL_RPATH $LIBRARY_OUTPUT_PATH)