我有一個這樣的項目結構,我希望使用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 make
在root/
目錄我期望父母和孩子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/
- 執行
cmake .
到crystal
文件夾,並手動調用Makefile由sudo make
- 來到
root/
再次和sudo make
調用外部的Makefile,這完美工作。
問:
爲什麼孩子CMake的,因爲我在什麼不工作部分中提到的是沒有得到調用???
一般建議:不要用CMake做_in-source_構建(即'cmake .')。在項目目錄樹之外創建一個單獨的構建目錄(例如,作爲「root /」的同級)。 –