2016-05-18 7 views
1

私はC++ライブラリMyLibを書いており、別のプロジェクトExternProと統合したいと思います。だから、ExternProに私はこのようなCMakeLists.txtを書いた:CMakeサブプロジェクトを別のものと統合する

add_subdirectory(MyLib) 
ADD_EXECUTABLE(test test.cpp) 
include_directories(${MyLib_INCLUDE_DIRS}) 
target_link_libraries(test ${MyLib_LIBRARIES}) 

を変数MyLib_LIBRARIESMyLib_INCLUDE_DIRSを設定するには、私が書いた:必要な

set(MyLib_LIBRARIES ${PROJECT_SOURCE_DIR}/src/MyLib.a CACHE INTERNAL "") 
set(MyLib_INCLUDE_DIRS ${PROJECT_SOURCE_DIR}/include CACHE INTERNAL "") 

しかし、何か間違ったこと「ターゲットMYLIB/SRC/MyLib.aを作るためにはありませんルールを、テストによって。停止します。

だから私の質問は、どのように私は正しくCMakeLists.txtを書いたはずですのでcmakeは私が最初にMyLibの構築を支援し、その後ExternProの依存関係の世話をすることができますか?

答えて

1

これら2つの別々のプロジェクトをしている場合は、私は通常、他から1つのライブラリを参照するために「CMakeのスクリプトを見つける」を使用:http://www.vtk.org/Wiki/CMake:How_To_Find_Libraries#Writing_find_modules

をしかし、私は通常、そこに記載さよりもわずかに異なる検索スクリプトを使用(FindMyLibrary.cmake):

# Find MyLibrary installation 
# 
# This module needs following variables specified (e.g. through cmake -Dvar=) 
# MyLibrary_ROOT_DIR   - root directory of the library installation 
# 
# This module defines the following variables: 
# MyLibrary_INCLUDE_DIRS  - Where to find the public headers 
# MyLibrary_LIBRARIES  - List of mandatory and optional libraries 
# MyLibrary_FOUND   - True if an installation was found 
# 
# Configuration variables for tis module: 
# MyLibrary_USE_STATIC_LIBS - Set to ON to force the use of the static 
#        libraries. Default is OFF. 

# If MyLibrary_ROOT_DIR was defined in the environment, use it. 
if(NOT MyLibrary_ROOT_DIR AND NOT $ENV{MyLibrary_ROOT_DIR} STREQUAL "") 
    set(MyLibrary_ROOT_DIR $ENV{MyLibrary_ROOT_DIR}) 
endif() 

if(NOT MyLibrary_ROOT_DIR) 
    set(MyLibrary_ROOT_DIR /usr) 
endif() 

message(STATUS "Using MyLibrary_ROOT_DIR: ${MyLibrary_ROOT_DIR}") 

find_path(MyLibrary_INCLUDE_DIRS 
      NAMES mylib/mylib.hpp 
      PATHS ${MyLibrary_ROOT_DIR} 
      PATH_SUFFIXES include) 

# Here we set the default components 
if(NOT MyLibrary_FIND_COMPONENTS) 
    set(MyLibrary_FIND_COMPONENTS mylibrary) 
endif() 

# Support preference of static libs by adjusting CMAKE_FIND_LIBRARY_SUFFIXES 
if(MyLibrary_USE_STATIC_LIBS) 
    set(_mylib_ORIG_CMAKE_FIND_LIBRARY_SUFFIXES ${CMAKE_FIND_LIBRARY_SUFFIXES}) 
    if(WIN32) 
    set(CMAKE_FIND_LIBRARY_SUFFIXES .lib .a ${CMAKE_FIND_LIBRARY_SUFFIXES}) 
    else() 
    set(CMAKE_FIND_LIBRARY_SUFFIXES .a) 
    endif() 
endif() 

foreach(COMPONENT ${MyLibrary_FIND_COMPONENTS}) 
    find_library(MyLibrary_${COMPONENT}_LIBRARY 
       NAMES ${COMPONENT} 
       HINTS ${MyLibrary_ROOT_DIR} 
       PATH_SUFFIXES lib64 lib 
       NO_DEFAULT_PATH) 
    set(MyLibrary_LIBRARIES ${MyLibrary_LIBRARIES} ${MyLibrary_${COMPONENT}_LIBRARY}) 
endforeach() 

# Restore the original find library ordering 
if(MyLibrary_USE_STATIC_LIBS) 
    set(CMAKE_FIND_LIBRARY_SUFFIXES ${_mylib_ORIG_CMAKE_FIND_LIBRARY_SUFFIXES}) 
endif() 

# handle the QUIETLY and REQUIRED arguments and set MyLibrary_FOUND to 
# TRUE if all listed variables are TRUE 
include(FindPackageHandleStandardArgs) 
find_package_handle_standard_args(
     MyLibrary "Could NOT find MyLibrary: set MyLibrary_ROOT_DIR to a proper location" 
     MyLibrary_LIBRARIES 
     MyLibrary_INCLUDE_DIRS) 

mark_as_advanced(MyLibrary_INCLUDE_DIRS MyLibrary_LIBRARIES) 

は、このように使用:

find_package(MyLibrary REQUIRED) 
include_directories(SYSTEM ${MyLibrary_INCLUDE_DIRS}) 

target_link_libraries(${TARGET} 
    ${MyLibrary_LIBRARIES} 
) 

基本的に、それはこのように書きます:

  1. ライブラリは、デフォルトの場所(例:/usr)、または他の場所(開発中の通常の場所)。
  2. FindMyLibrary.cmakeは、ライブラリインストールの一部(RPMライブラリdevelパッケージ用)であり、同様に$ {instdir}/share/cmake/Modulesにインストールされます。
  3. 従属プロジェクトは、CMAKE_MODULE_PATHにパスを追加し、findスクリプトを使用して、インストールされているパブリックヘッダーとライブラリを検索します。

利点は、開発中に(ライブラリソースを持っていてライブラリをビルドしているとき)、またはライブラリソースもなく(ライブラリとヘッダーだけでは、開発者パッケージ - システムにインストールされています)。

同様のテクニックは通常Boostなど(すでにCMakeによって提供されている検索スクリプト)によって使用されます。

+0

ありがとうございましたaxalis!しかし、Githubの 'MyLib'をサブモジュールとしてクローン化し、' ExternPro'と統合したいのであれば、どうすれば 'FindMyLibrary.cmake'を修正すればい​​いですか?私はライブラリを使いやすくしたいと思います:) –

1

ライブラリへのパスではなく、ライブラリターゲットtarget_link_librariesに使用してください。あなたのライブラリプロジェクトがメインプロジェクト内の実行の

add_library(MyLib ...) 

リンクはサブディレクトリに設定された変数が設定されていないので、このすべての最初には動作しません

target_link_libraries(test MyLib) 
1

で実行する必要が含まれていると仮定すると、

親ディレクトリの場合

だからこれを解決するために、適切に、あなたは次のようにMYLIBを定義する必要があります。

add_library(MyLib ...) 
target_include_directories(MyLib INTERFACE ${PROJECT_SOURCE_DIR}/include) 

そしてExternProのために、あなただけのMYLIBにリンクする必要があります。

target_link_libraries(test MyLib) 

これは自動的にに含めるディレクトリを追加しますをテストし、MyLibを適切にリンクしてください。

関連する問題