我正在学习CMake和我与它挣扎了一点。我的“项目”是使用被作为一个.cpp文件和两个.h文件提供JsonCpp“库”。该结构是这样的:
myProject
build/
json/
CMakeLists.txt
jsoncpp.cpp
include/
json.h
json-forward.h
CMakeLists.txt
main.cpp
建立/的CMakeLists.txt:
cmake_minimum_required(VERSION 3.6.0)
project(myProject)
add_subdirectory(json)
add_executable(app main.cpp)
target_link_libraries(app PRIVATE json)
# add_executable(app main.cpp json/jsoncpp.cpp json/include/json.h json/include/json-forwards.h)
JSON /的CMakeLists.txt:
cmake_minimum_required(VERSION 3.6.0)
add_library(
json
jsoncpp.cpp
include/json.h
include/json-forwards.h
)
target_include_directories(json PUBLIC '${CMAKE_CURRENT_SOURCE_DIR}/include')
那是什么转变jsoncpp成静态库只使用add_executable()与所有的.cpp文件,并使用target_link_libraries之间的差异,然后链接呢?我应该选择什么样的方法?
下一件事困惑我是一个target_include_directories()。什么是使用这个功能的好处是什么?如果我评论它,并运行cmake(然后makefile文件和启动应用程序)的一切仍然正常工作。如果我删除 “包括/ json.h” “包括从add_library / JSON-forward.h”(),一切都仍然有效。
那是什么转变jsoncpp成静态库只使用add_executable()与所有的.cpp文件,并使用target_link_libraries之间的差异,然后链接呢?我应该选择什么样的方法?
使用add_library
当你使用相同的代码jsoncpp 2个可执行文件是必需的。在这种情况下,如果你列出jsoncpp源在两个add_executable()
电话,你必须编译它的两倍。将它们分组到add_library()
将使它只编译一次,然后连接到这两个可执行文件。
使用add_library
另一个原因是纯粹的模块的逻辑组合物。