我正在学习CMake,但为此有些挣扎。我的“项目”是使用被作为一个.cpp文件和两个.h文件提供JsonCpp“库”。结构如下:
myProject
build/
json/
CMakeLists.txt
jsoncpp.cpp
include/
json.h
json-forward.h
CMakeLists.txt
main.cpp
build / 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')
有什么用只add_executable()与所有的.cpp文件,并使用该target_link_libraries变换jsoncpp为静态库,然后将其链接之间的区别吗?我应该选择什么样的方法呢?
一个接下来的事情困惑我是target_include_directories()。使用此功能有什么好处?如果我对此进行评论,然后运行cmake(然后生成文件并启动应用程序),一切仍然可以正常进行。如果我从add_library()中删除“ include / json.h”,“ include / json-forward.h”,一切仍然有效。
答案 0 :(得分:0)
有什么用只add_executable()与所有的.cpp文件,并使用该target_link_libraries变换jsoncpp为静态库,然后将其链接之间的区别吗?我应该选择什么样的方法呢?
当您有2个使用相同jsoncpp代码的可执行文件时,需要使用add_library
。在这种情况下,如果您在两个add_executable()
调用中列出jsoncpp源,则必须将其编译两次。将它们分组为add_library()
将使其仅编译一次,然后链接到两个可执行文件。
使用add_library
的另一个原因是模块的纯粹逻辑组成。