我应该只使用add_executable()与原始cpp文件或通过add_library使库()?

时间:2019-02-02 20:59:57

标签: c++ cmake

我正在学习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”,一切仍然有效。

1 个答案:

答案 0 :(得分:0)

  

有什么用只add_executable()与所有的.cpp文件,并使用该target_link_libraries变换jsoncpp为静态库,然后将其链接之间的区别吗?我应该选择什么样的方法呢?

当您有2个使用相同jsoncpp代码的可执行文件时,需要使用add_library。在这种情况下,如果您在两个add_executable()调用中列出jsoncpp源,则必须将其编译两次。将它们分组为add_library()将使其仅编译一次,然后链接到两个可执行文件。

使用add_library的另一个原因是模块的纯粹逻辑组成。