我正在创建一个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项目,但是在相同的解决方案中,在这种情况下,我可以看到类似这个:
但是,我想看到的是,假设这是可能的,是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)
答案 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 ./)