2016-12-25 67 views
0

我有一個這樣的項目結構,我希望使用CMake構建。CMake add_subdirectory不調用子CMakeLists.txt

root\ 
| 
|--crystal\ 
|  | 
|  |--include\ Math.h, Window.h 
|  |--src\ Math.cpp, Window.cpp 
|  |--lib\ 
|  |--CMakeLists.txt // the CHILD cmake 
| 
|--game\ main.cpp 
|--CMakeLists.txt // the PARENT cmake 

晶體子項目應該產生在lib/文件夾中的靜態庫(libcrystal.a)(使用的include/src/的內容)和項目將產生一個可執行出game/main.cpp鏈接libcrystal.a靜態庫。

家長的CMake如下:

cmake_minimum_required(VERSION 2.8.1) 
project(thegame) 

set(CRYSTAL_LIB_DIR lib) 
set(CRYSTAL_LIB_NAME crystal) 

add_subdirectory(${CRYSTAL_LIB_NAME}) 

set(LINK_DIR ${CRYSTAL_LIB_NAME}/${CRYSTAL_LIB_DIR}) 

set(SRCS game/main.cpp) 
link_directories(${LINK_DIR}) 
include_directories(${CRYSTAL_LIB_NAME}/include) 

add_executable(thegame ${SRCS}) 
target_link_libraries(thegame lib${CRYSTAL_LIB_NAME}.a) 

孩子的CMake如下:

cmake_minimum_required(VERSION 2.8.1) 

project(crystal) 

include_directories(include) 
file(GLOB_RECURSE SRC "src/*.cpp") 

set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${CRYSTAL_LIB_DIR}) 
add_library(${CRYSTAL_LIB_NAME} STATIC ${SRC}) 

什麼不工作:

當我執行cmake .sudo makeroot/目錄我期望父母和孩子cmake順序運行。但它似乎像孩子cmake 沒有被調用,因此不產生.a文件。它顯示了一些錯誤,如:

Scanning dependencies of target thegame 
[ 20%] Building CXX object CMakeFiles/thegame.dir/game/main.cpp.o 
[ 40%] Linking CXX executable thegame 
/usr/bin/ld: cannot find -lcrystal 
collect2: error: ld returned 1 exit status 
CMakeFiles/thegame.dir/build.make:94: recipe for target 'thegame' failed 
make[2]: *** [thegame] Error 1 
CMakeFiles/Makefile2:67: recipe for target 'CMakeFiles/thegame.dir/all' failed 
make[1]: *** [CMakeFiles/thegame.dir/all] Error 2 
Makefile:83: recipe for target 'all' failed 
make: *** [all] Error 2 

什麼是工作:

我繼續在root/

  • 導航這樣做

    1. 執行cmake .crystal文件夾,並手動調用Makefile由sudo make
    2. 來到root/再次和sudo make

    調用外部的Makefile,這完美工作

    問:

    爲什麼孩子CMake的,因爲我在什麼不工作部分中提到的是沒有得到調用???

  • +1

    一般建議:不要用CMake做_in-source_構建(即'cmake .')。在項目目錄樹之外創建一個單獨的構建目錄(例如,作爲「root /」的同級)。 –

    回答

    2

    在根CMakeLists.txt中使用target_link_libraries(thegame ${CRYSTAL_LIB_NAME})並刪除link_directories調用。 CMake將認識到您正在鏈接到crystal目標並相應地設置makefile相關性和編譯器標誌。

    +0

    這解決了我的問題。所以,'lib'前綴和'.a'擴展名不是顯式需要的。但是我想知道爲什麼刪除'link_directories'調用不影響任何東西。 'g ++'的'-L'開關不是必需的嗎? –

    +1

    @AyanDas CMakes指出並補充了所需的一切。作爲一個經驗法則,將庫的完整路徑傳遞到'target_link_libraries'並且不要完全使用'link_directories'。 – arrowd

    相關問題