Есть ли способ добавлять файлы таким же образом, как цель, включающие в себя каталоги, но для отдельных файлов?

В случае моего использования в этом случае. Я использую много шаблонов и концепций, и мои файлы заголовков становятся громоздкими. Мне очень понравилось, имея реализацию разделения от определений, так что хотите что-то вроде так:

.h файл

template <typename T>
T foo(T bar);

#include <name_of_implementation_file>

Реализация .h файл

template <typename T>
T foo(T bar) { return bar; };

В настоящее время включает в виду: {{x0}}

Это раздражает, так как позже рефакторинг становится проблемой. Я также не хочу добавлять дополнительные каталоги с одним или двумя файлами и вызывать target_include_directories. Я не хочу просто include, поскольку мой проект является библиотекой, и я не хочу, чтобы пользователь мог включать файлы реализации. Я также создаю несколько целей и хочу хранить их включенные файлы отдельно.

0
Edward 12 Окт 2020 в 16:08

1 ответ

Лучший ответ

Самым простым будет сохранять файлы реализации в том же каталоге, что и файлы заголовка - таким образом, простой {{x0}} будет достаточно, потому что включает в себя {{{x1}} ток поиска, включают в себя каталог сначала. Если нет, - переместить файлы реализации в подкаталог, и переместите файлы реализации в подкаталог

есть ли что-то похожее на target_include_files в cmake

Нет, нет.

Есть ли способ добавлять файлы таким же образом, как цель, включающие в себя каталоги, но для отдельных файлов?

Единственный способ:

  • создать пустой каталог (где-нибудь в CMAKE_CURRENT_BINARY_DIR)
  • Скопируйте файл там
  • добавьте этот каталог в include_directories

Просто для удовольствия, это выглядит легко реализовать, в непроверенном псевдокоде:

function(target_include_files target mode)
    string(MD5 dir "${ARGN}")
    set(dir ${CMAKE_CURRENT_BINARY_DIR}/${dir})
    file(MAKE_DIRECTORY ${dir})
    foreach(i IN LISTS ARGN)
       # TODO: replace with build-time generation
        configure_file(${i} ${CMAKE_CURRENT_BINARY_DIR}/${dir} COPYONLY)
    endforeach()
    target_include_directories(${target} ${mode} ${dir})
endfunction()

Мне очень понравилось, что реализация отделена от определений, поэтому хочу что-то вроде этого:

Самым простым было бы хранить файлы реализации в том же каталоге, что и файлы заголовков - в этом случае будет достаточно простого #include "file", потому что включения с " сначала выполняют поиск в текущем каталоге включаемых файлов. Если нет - переместите файлы реализации в подкаталог и просто включите подкаталог также относительно текущего файла. Если нет - добавьте в пути поиска другой каталог с файлами реализации.

Я не хочу, чтобы пользователь мог включать файлы реализации.

TLDR: Для пользователя использовать шаблон, пользователь должен увидеть его все .

Я бы хотел, чтобы пользователь мог сделать это [создать экземпляр шаблона] самостоятельно,

Тогда это невозможно сделать , чтобы сделать это (или это делает вашу библиотеку просто непригодна и бессмысленно). Любой, кто использует шаблон, чтобы мгновенно его можно сделать , должен видеть все определение шаблона (или в некоторых случаях

Для дальнейшего исследования я советую просто изучить термин «явное создание экземпляра» в контексте C ++, шаблонов, а также когда он используется и чем он отличается от «неявного создания экземпляра». Для получения дополнительных сведений ознакомьтесь с материалами о том, как работают компилятор и компоновщик, что такое связывание и как создавались шаблоны C ++.

1
KamilCuk 12 Окт 2020 в 13:59