我有一个这样的项目结构,我希望使用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 /”的同级)。 –