Предоставление директории include вне исходной папки для пользователей статической библиотеки - PullRequest
0 голосов
/ 25 октября 2019

Я занимаюсь разработкой простой статической библиотеки C для целей обучения с использованием cmake. В некоторых проектах, таких как GLFW , в корневом каталоге есть папка include, поэтому пользователи библиотеки могут скопировать ее и использовать в качестве включаемого каталога.

В моей библиотеке я хочу иметь *Папка 1006 * в корневом каталоге, поэтому, когда я использую библиотеку в других проектах, я могу просто скопировать эту папку и установить ее в качестве включаемого каталога.

Вот упрощенная структура папок моей библиотеки:

include
+--mylib.h

src
+--myheader.h
+--mysource.c
+--CMakeLists.txt

CmakeLists.txt

В папке src есть мои заголовки и файлы реализации, а CMakeLists.txt для создания статической библиотеки из mysource.c.

CMakeLists в корневой папке просто устанавливает проекти добавляет src в качестве подкаталога.

Я хочу, чтобы у файла mylib.h был #include <myheader.h>.

Вот объезд, чтобы поговорить о том, как я хочу его использоватькогда это будет сделано.

Идея состоит в том, что при использовании lib в другом проекте у меня может быть что-то вроде этого:

deps
+--include
   +--mylib.h

src
+--main.c

А в файле main.c включитеmylib.h и используйте то, что определено на myheader.h Здесь объезд заканчивается, и я говорюng о моем текущем проекте lib снова.

Как мне добиться этого с помощью cmake? Насколько я знаю, файл mylib.h должен знать, что он включает в себя файлы из директории src, но я не вижу способа установить это, так как для примера в GLFW этот каталог не имеет CMakeLists.txt.

1 Ответ

1 голос
/ 27 октября 2019

Я хочу заверить, что это проблема проектирования, поскольку для вас будет иметь смысл, если бы вы установили библиотеку в систему до того, как пытались ее использовать. То есть, не используя 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...