Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 我应该只对原始cpp文件使用add_executable(),还是通过add_library()创建库?_C++_Cmake - Fatal编程技术网

C++ 我应该只对原始cpp文件使用add_executable(),还是通过add_library()创建库?

C++ 我应该只对原始cpp文件使用add_executable(),还是通过add_library()创建库?,c++,cmake,C++,Cmake,我正在学习CMake,我正在努力学习。我的“项目”使用的是JsonCpp“库”,它作为一个.cpp文件和两个.h文件提供。结构如下所示: myProject build/ json/ CMakeLists.txt jsoncpp.cpp include/ json.h json-forward.h CMakeLists.txt main.cpp build/CMakeLi

我正在学习CMake,我正在努力学习。我的“项目”使用的是JsonCpp“库”,它作为一个.cpp文件和两个.h文件提供。结构如下所示:

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)
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')
json/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)
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')
只对所有.cpp文件使用add_executable()和使用将jsoncpp转换为静态库然后链接它的目标链接库有什么区别?我应该选择什么方法

接下来让我困惑的是一个目标目录()。使用此功能有什么好处?如果我对它发表评论,然后运行cmake(然后生成文件并启动应用程序),一切都正常。如果我从add_library()中删除“include/json.h”和“include/json forward.h”,一切仍然有效

只对所有.cpp文件使用add_executable()和使用将jsoncpp转换为静态库然后链接它的目标链接库有什么区别?我应该选择什么方法

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

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