2016-05-03 24 views
0

我試圖按照採取的方法here來調用CMake內現有的Makefile(建立一個靜態庫)。add_dependencies傳遞性與add_subdirectory

我的情況看起來如下目錄與一個Makefile內置

  • 靜態庫project/makefile_lib
  • 通過CMake又建庫(cmake_lib)取決於makefile_lib目錄project
  • 的可執行文件,使用cmake_lib也在目錄project

我的CMakeLists.txtproject看起來如下。

project(cmake_makefile) 
cmake_minimum_required(VERSION 2.8.12) 

add_subdirectory(makefile_lib) 

add_library(cmake_lib cmake_lib.c) 

target_include_directories(cmake_lib 
    PRIVATE makefile_lib 
) 

target_link_libraries(cmake_lib makefile_lib) 

add_executable(main main.c) 

target_link_libraries(main cmake_lib) 

而且在project/makefile_lib

add_custom_target(build_makefile_lib 
    ALL 
    COMMAND ${CMAKE_MAKE_PROGRAM} 
    WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} 
    COMMENT "makefile_lib makefile" 
) 

add_library(makefile_lib STATIC IMPORTED) 
set_target_properties(makefile_lib 
    PROPERTIES IMPORTED_LOCATION ${CMAKE_CURRENT_SOURCE_DIR}/libmakefile_lib.a 
) 

add_dependencies(makefile_lib build_makefile_lib) 

CMakeLists.txt按照add_dependencies文檔:

依賴也會添加到導入的目標是在它的地方傳遞地執行了這個目標本身不建。

project目錄中我調用

mkdir build 
cd build/ 
cmake .. 
make 

但Makefile文件project/makefile_lib則永遠不會調用和構建失敗,cannot find -lmakefile-lib

有趣的是,如果我移動的project/makefile_lib內容爲project和頂級CMakeLists.txtproject/makefile_lib/CMakeLists.txt內容替換add_subdirectory命令此方法效果。

爲什麼在這種情況下,add_dependencies命令看起來並沒有傳遞?

+0

區別在於,當你的代碼是根'CMakeLists的一部分。txt'表示'WORKING_DIRECTORY $ {CMAKE_CURRENT_SOURCE_DIR}'指向你的根目錄'project'。否則它指向'project/makefile_lib'。你確定你的'makefile'在子目錄嗎? – Florian

回答

1

問題出在add_library命令。從文檔

目標名稱在其創建的目錄中有作用域,下面是 ,但GLOBAL選項擴展了可見性。

因此,解決辦法是把GLOBAL選項,在project/makefile_lib/CMakeLists.txt

add_custom_target(build_makefile_lib 
    ALL 
    COMMAND ${CMAKE_MAKE_PROGRAM} 
    WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} 
    COMMENT "makefile_lib makefile" 
) 

add_library(makefile_lib STATIC IMPORTED GLOBAL) 
set_target_properties(makefile_lib 
    PROPERTIES IMPORTED_LOCATION ${CMAKE_CURRENT_SOURCE_DIR}/libmakefile_lib.a 
) 

add_dependencies(makefile_lib build_makefile_lib) 

編輯添加到add_library命令:請注意,這不適用於CMake的版本一起< = 2.8.7,其中GLOBAL標誌尚不存在。有關可能的解決方法,請參閱here