Файлы включаются во внешнюю цель с помощью CMake и Visual Studio - PullRequest
0 голосов
/ 10 июля 2020

Я работаю над проектом среднего размера, который использует CMake. В последнее время я обнаружил странное поведение при создании файлов проекта для Visual Studio 2019. Проблема:

Пусть A и B будут целями. A - это исполняемый файл, который зависит от B, библиотеки c stati. Отношения устанавливаются с использованием target_link_libraries.

Если я загружу этот проект в Visual Studio, мне будет представлена ​​следующая структура каталогов:

Solution/
- Project A/
  - src/
    - sources_of_a.cpp
    - ...
  - B/ # <- WHY?
    - all_sources_of_b.cpp
      ...
- Project B/
  - src/
    - sources_of_b.cpp
      ...

Честно говоря, я даже не знаю, как чтобы лучше описать эту проблему, не говоря уже о том, что может ее вызвать. Все, что я знаю, это то, что источники B не должны быть частью набора источников A.

Кто-нибудь знает, что происходит?

Примечательные примечания на стороне:

  • B - фактически цель, импортированная через FetchContent & add_subdirectory
  • Фактически я использую CPM вместо FetchContent; однако я попробовал только FetchContent, проблема не устранена
  • Это происходит не со всеми моими целями

1 Ответ

0 голосов
/ 12 июля 2020

Проблема заключалась в вызовах target_source, где заголовки были указаны как publi c sources. Т.е. вот так:

target_sources(
    B
    PRIVATE
        ${CMAKE_CURRENT_SOURCE_DIR}/src/source_of_b_.cpp
    PUBLIC
        ${CMAKE_CURRENT_SOURCE_DIR}/include/B/header_of_b.hpp
)

Удаление маркера PUBLIC решает проблему. Измените его на это:

target_sources(
    B
    PRIVATE
        ${CMAKE_CURRENT_SOURCE_DIR}/src/source_of_b_.cpp
        ${CMAKE_CURRENT_SOURCE_DIR}/include/B/header_of_b.hpp
)

По-видимому, я совершенно неправильно понял семантику, хотя документация CMake лучше всего подходит в классе .

...