C++ 仅标题库的Visual studio项目

C++ 仅标题库的Visual studio项目,c++,cmake,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_subdirect

我正在创建一个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)

我正在使用这些来生成一个VisualStudio解决方案,但是我想做的是为仅标题库生成一个单独的项目

基本上,我有一个小的列表库,通过使用模板,我将其转换为仅标题库,在这种更改之前,我能够生成单独的visual studio项目,但在同一个解决方案中,在本例中,我可以看到如下内容:

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

但我希望看到的是,假设这是可能的,则是针对
元素数据结构的单独项目

我不是CMake和所有设置方面的专家,但如果你能帮我弄清楚怎么做,我会很高兴

更新

根据评论中的建议,我在VS中得到了一个新项目,但是仍然有一点困扰着我。 在下图中,我可以看到
alg和ds
以及
ElementaryDataStructures\uu
引用了相同的源。有没有办法避免alg和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)

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

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

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

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

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 ./)

您好,我应该在两个CMakeLists.txt中的哪一个添加您的行?@user8469759,它用于您的接口库。所以在第二个文件的某个地方添加它。谢谢,它工作了,但是现在我可以在两个项目中看到这些文件。有什么我可以做的,我只能看到他们的项目中的文件吗?(我的帖子中有更新,也许我说的更清楚)。@user8469759,从界面库中删除
target\u sources
命令即可。你不需要它。伟大的解决方案!我发现将
EXCLUDE\u FROM\u ALL
添加到
add\u library()
调用会阻止从
conan build
调用生成库。关于更新,您可以通过删除
target\u sources
调用来删除双源引用。因为它不只是为这个标题“库”构建二进制文件,所以cmake不需要知道源代码,只需要知道include目录。