Должен ли я использовать только add_executable () с необработанными файлами cpp или создать библиотеку с помощью add_library ()? - PullRequest
0 голосов
/ 02 февраля 2019

Я изучаю 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)

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 (затем makefile и запустите приложение), все будет работать нормально.Если я удаляю «include / json.h», «include / json-forward.h» из add_library (), все по-прежнему работает.

1 Ответ

0 голосов
/ 03 февраля 2019

В чем разница между использованием только add_executable () со всеми файлами .cpp и использованием target_link_libraries, который преобразует jsoncpp в статическую библиотеку, а затем связывает ее?Какой подход я должен выбрать?

Использование add_library требуется, когда у вас есть 2 исполняемых файла, использующих один и тот же код jsoncpp.В этом случае, если вы перечислите источники jsoncpp в обоих вызовах add_executable(), вам придется скомпилировать их дважды.Группировка их в add_library() приведет к компиляции только один раз, а затем будет связана с обоими исполняемыми файлами.

Другая причина использования add_library - это чисто логическая композиция модулей.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...