Я хочу заверить, что это проблема проектирования, поскольку для вас будет иметь смысл, если бы вы установили библиотеку в систему до того, как пытались ее использовать. То есть, не используя add_subdirectory (), но find_library () при использовании.
Во-первых, если вы используете внешнюю библиотеку, но не устанавливаете ее, вы включили бы все файлы в вашу deps-папку. Все файлы, включая исходные файлы и т. Д., Будут скомпилированы помимо вас main.c. Это делается с помощью add_subdirectory (deps / MyLib) и позже также включается в ваш основной проект.
Пример:
add_subdirectory(deps/MyLib EXCLUDE_FROM_ALL)
target_link_libraries(${PROJECT_NAME} PRIVATE MyLib)
target_include_directories(${PROJECT_NAME} PRIVATE MyLib)
Если вы не хотите его все время компилировать, тогдаВы должны указать cmake, где он может найти заголовки и библиотечные файлы. Предпочтительным способом является использование find_library (), которая делает магию за вас. Поскольку вы не упомянули ни о какой установке, я буду предполагать, что она не существует, и тогда вы можете использовать add_subdirectory ().
"Я могу просто скопировать эту папку и установить ее как каталог включения. "
CMake хочет обработать эти вещи для вас, поэтому вы никогда не должны копировать заголовки. Вы должны либо использовать add_subdirectory (), чтобы включить проект / заголовки, либо использовать find_library (), которая гарантирует, что вы найдете, где находятся заголовки в системе.
Я предлагаю вам научиться устанавливать инструкциибиблиотека в систему и как использовать ее позже, но только с помощью find_library (). Тогда библиотека будет глобальной для всех проектов и также не будет дублироваться.
Добавление некоторого псевдокода в надежде, что все это имеет больше смысла. Хотя это происходит вокруг add_subdirectory (), поскольку, к сожалению, код для установки довольно велик.
CMakeLists.txt для main.c
cmake_minimum_required(VERSION 3.8)
project(MyLibTest)
add_executable(${PROJECT_NAME}
src/main.c
)
add_subdirectory(external/MyLib EXCLUDE_FROM_ALL)
target_link_libraries(${PROJECT_NAME} PRIVATE MyLib)
target_include_directories(${PROJECT_NAME} PRIVATE MyLib)
CMakeLists.txt для библиотеки
cmake_minimum_required(VERSION 3.8)
project(MyLib)
add_library(${PROJECT_NAME} STATIC
src/MyLib.c
)
target_include_directories(${PROJECT_NAME}
PUBLIC
$<INSTALL_INTERFACE:include>
$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include>
)
Структура проекта будет тогда:
/
external/MyLib
external/MyLib/src
MyLib.c
external/MyLib/include
MyLib.h
src
main.c
CMakeLists.txt