仅标头库的Visual Studio项目

时间:2018-09-02 20:48:38

标签: c++ cmake

我正在创建一个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解决方案,但是我想做的是为仅标头库生成一个单独的项目。

基本上,我有一个小的列表库,可以通过使用模板将其转换为仅标头的库,在进行此类更改之前,我可以生成单独的Visual Studio项目,但是在相同的解决方案中,在这种情况下,我可以看到类似这个:

enter image description here

但是,我想看到的是,假设这是可能的,是ElementaryDataStructures的一个单独项目。

我不是CMake和所有设置方面的专家,但是如果您能帮助我弄清楚如何做到这一点,我将非常高兴。

更新

在评论之后,我在VS中得到了一个新项目,但是仍然有一点让我感到困扰。 在下面的图片中,我可以看到alg-and-dsElementaryDataStructures_引用了相同的来源。有没有一种方法可以避免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

2 个答案:

答案 0 :(得分:1)

据我所知,没有正常的方法可以做到。只是一个小东西。因此,您将创建一个自定义目标,该目标将强制MSVC在解决方案树中显示该项目。像这样:

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

请注意名称中的下划线:可以将其与add_library命令中的名称区分开。当然,您需要将我的示例中的变量替换为您的实际变量。

答案 1 :(得分:0)

另一种解决方案是使用存根源文件声明静态库:

file(TOUCH ${CMAKE_BINARY_DIR}/stub.cpp)

add_library(elementary-data-structures STATIC
    "${CMAKE_BINARY_DIR}/stub.cpp"
    "${CMAKE_CURRENT_LIST_DIR}/list.h"
    "${CMAKE_CURRENT_LIST_DIR}/list.tcc"
)
target_include_directories(elementary-data-structures INTERFACE ./)