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

问题描述 投票:1回答:1

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

c++ cmake
1个回答
0
投票

那是什么转变jsoncpp成静态库只使用add_executable()与所有的.cpp文件,并使用target_link_libraries之间的差异,然后链接呢?我应该选择什么样的方法?

使用add_library当你使用相同的代码jsoncpp 2个可执行文件是必需的。在这种情况下,如果你列出jsoncpp源在两个add_executable()电话,你必须编译它的两倍。将它们分组到add_library()将使它只编译一次,然后连接到这两个可执行文件。

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

© www.soinside.com 2019 - 2024. All rights reserved.