Визуальный студийный проект для библиотеки только заголовков - PullRequest
0 голосов
/ 02 сентября 2018

Я создаю проект CMake, два основных файла которого:

cmake_minimum_required(VERSION 3.10 FATAL_ERROR)
project(CPP_Algorithms_and_Data_Structures)

set( CMAKE_CXX_STANDARD 11 )

#add_subdirectory(./ElementaryAlgorithms)
add_subdirectory(./ElementaryDataStructures)
#add_subdirectory(./AdvancedDataStructures)
#add_subdirectory(./GraphAlgorithms)

#set(INCLUDE_FOLDERS 
#   ./
#   ./ElementaryAlgorithms 
#   ./ElementaryDataStructures 
#   ./AdvancedDataStructures 
#   ./GraphAlgorithms)

set(INCLUDE_FOLDERS ./ ./ElementaryDataStructures)

set(HEADER_FILES alg-and-ds.h)
set(SRC_FILES main.cpp alg-and-ds.cpp)

add_executable(alg-and-ds ${SRC_FILES} ${HEADER_FILES})
target_include_directories(alg-and-ds PUBLIC ${INCLUDE_FOLDERS})
target_link_libraries(alg-and-ds elementary-data-structures)

#target_link_libraries(alg-and-ds
#   graph-algorithms
#   elementary-data-structures
#   elementary-algorithms
#   advanced-data-structures)

и

cmake_minimum_required(VERSION 3.10 FATAL_ERROR)
project(ElementaryDataStructures)

set( CMAKE_CXX_STANDARD 11 )

if(WIN32)
    set(CMAKE_WINDOWS_EXPORT_ALL_SYMBOLS YES CACHE BOOL "Export all symbols")
endif()

add_library(elementary-data-structures INTERFACE)
target_include_directories(elementary-data-structures INTERFACE ./)
target_sources(elementary-data-structures INTERFACE 
    "${CMAKE_CURRENT_LIST_DIR}/list.h"
    "${CMAKE_CURRENT_LIST_DIR}/list.tcc")
#set_target_properties(elementary-data-structures PROPERTIES RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR})

Я использую их для создания визуального студийного решения, однако я хотел бы создать отдельный проект для библиотеки только для заголовков.

По сути, у меня была небольшая библиотека списков, которую я преобразовал в библиотеку только для заголовков, используя шаблоны, перед таким изменением я смог создать отдельные проекты Visual Studio, но в том же решении, в этом случае вместо этого я вижу что-то вроде это:

enter image description here

Но то, что я хотел бы увидеть, если предположить, что это возможно, это отдельный проект для ElementaryDataStructures.

Я не специалист по CMake и всем его настройкам, но я был бы рад, если бы вы помогли мне разобраться, как это сделать.

Обновление

Следуя предложению комментария, я получил новый проект в VS, однако есть еще кое-что, что беспокоит меня. На рисунке ниже я вижу как alg-and-ds и ElementaryDataStructures_, ссылающиеся на одни и те же источники. Есть ли способ избежать показа таких файлов в проекте alg-and-ds?

Обновление CMakeLists.txt

cmake_minimum_required(VERSION 3.10 FATAL_ERROR)
project(ElementaryDataStructures)

set( CMAKE_CXX_STANDARD 11 )

if(WIN32)
    set(CMAKE_WINDOWS_EXPORT_ALL_SYMBOLS YES CACHE BOOL "Export all symbols")
endif()

add_library(elementary-data-structures INTERFACE)
target_include_directories(elementary-data-structures INTERFACE ./)
target_sources(elementary-data-structures INTERFACE 
    "${CMAKE_CURRENT_LIST_DIR}/list.h"
    "${CMAKE_CURRENT_LIST_DIR}/list.tcc")
add_custom_target(ElementaryDataStructures_ SOURCES ${CMAKE_CURRENT_LIST_DIR}/list.h ${CMAKE_CURRENT_LIST_DIR}/list.tcc)

enter image description here

1 Ответ

0 голосов
/ 03 сентября 2018

Насколько я знаю, нет нормального способа сделать это. Только хакерский. Таким образом, вы создаете пользовательскую цель, которая заставит MSVC показывать проект в дереве решений. Примерно так:

add_custom_target(${PROJECT_NAME}_ SOURCES ${PROJECT_SOURCES})

Обратите внимание на подчеркивание в имени: оно должно отличать его от имени в команде add_library. Конечно, вам нужно заменить переменные в моем примере вашими реальными.

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