11
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.2cmakeバージョン2.8.9Fedora 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つを持っています。

提案をありがとう、

4

2 に答える 2

5

このエラーは、で定義されているものとはinstall異なるCMakeLists.txtを呼び出した結果のようです。apr-1add_library

ルートCMakeLists.txtで実行していると思います。add_library(apr-1 ...)つまり、ここでを呼び出す必要がありますinstall(TARGETS apr-1 ARCHIVE DESTINATION lib)

「...このディレクトリに存在しません」というエラーメッセージに注意してください。ファイルシステムの意味で実際のディレクトリを参照しているのではなく、add_subdirectoryコマンドを介して生成される概念的なディレクトリを参照しています。

編集

apr-1あなたのコメントに照らして、問題は実際のCMakeターゲットではなく、単なるライブラリであるように思われます。

この場合、コマンドをバージョンにすることはinstallできません。またはにする必要があります。これはおそらく、フルパスを取得するために、たとえばを使用してライブラリを見つける必要があることを意味します。TARGETSinstall(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変数の詳細については、RPATH処理に関するCMakeWikiを参照してください。

于 2013-03-18T08:20:55.227 に答える
0

これをCMakeLists.txtに追加してみてください

set(CMAKE_INSTALL_RPATH $LIBRARY_OUTPUT_PATH)
于 2013-05-21T07:13:48.623 に答える