cpack не может найти библиотеки, target не существует в этом каталоге

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

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

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

I после установки у меня есть эта структура каталогов на целевой установочной машине, поэтому исполняемый файл будет связан с новым 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.

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

2 ответов


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

в этом случае


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

set(CMAKE_INSTALL_RPATH $LIBRARY_OUTPUT_PATH)