【问题标题】:Using CMake with templates将 CMake 与模板一起使用
【发布时间】:2019-02-01 11:14:22
【问题描述】:

我有一个小的git project 用于基本算法和数据结构,特别是我打算用模板更改this bit,目前一切都是整数。 CMakeList.txt 是这样的:

cmake_minimum_required(VERSION 3.10 FATAL_ERROR)
project(ElementaryDataStructures)

set( CMAKE_CXX_STANDARD 11 )

include_directories(./)

set( HEADER_FILES list.h bstree.h rbtree.h)
set( SRC_FILES list.cpp bstree.cpp rbtree.cpp)

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

add_library(elementary-data-structures SHARED ${SRC_FILES} ${HEADER_FILES})
set_target_properties(elementary-data-structures PROPERTIES RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR})
#set_target_properties(elemetary-data-structures PROPERTIES LINKER_LANGUAGE CXX)

虽然主要的 CMakeLists.txt 是

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)

include_directories(${INCLUDE_FOLDERS})

set(SRC_FILES main.cpp)

add_executable(alg-and-ds ${SRC_FILES})
target_link_libraries(alg-and-ds 
    elementary-algorithms
    elementary-data-structures
    advanced-data-structures)

所以基本上我想用模板类替换list.h 中的List 的定义,而不是list.cpp,我想用list.tpp 来实现。应该如何更改我的 CMakeLists.txts 以支持模板?

是否只包括文件夹?还是我应该记住一些微妙的事情?

更新

我确实更改了我的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 SHARED "")
target_include_directories(elementary-data-structures PUBLIC ./)
target_sources(elementary-data-structures PUBLIC 
    "${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})

我收到了这个错误:

-- Selecting Windows SDK version 10.0.16299.0 to target Windows 10.0.17134.
-- Configuring done
CMake Error: CMake can not determine linker language for target: elementary-data                    -structures
-- Generating done
-- Build files have been written to: C:/Users/Lukkio/Project/CPP-AlgAndDS/build

我做错了什么?

【问题讨论】:

  • 请考虑使用target_include_directories 而不是全局include_directories

标签: c++ templates cmake


【解决方案1】:

我的 CMakeLists.txt 应该如何更改以支持模板?

是否只包括文件夹?还是我应该记住一些微妙的事情?

通过使用模板,您还可以迁移到仅包含标头的库。替换所有实现后,您将没有 .cpp 文件。

你不需要做任何特别的事情。但是,在谷歌搜索“CMake Header-only library”时,您会看到将您的库标记为“INTERFACE”的建议。 1, 2

  • target_sources 可用于告诉 CMake 输入文件。或者,您可以通过target_include_directories 隐式导出它们。但是,如果您从库中创建一个包(debian 等),它们将不会被安装。

推荐

  • 将目录范围的include_directories 替换为target_include_directories(elementary-data-structures PUBLIC .),从而摆脱它。 include_directories 是老式 CMake,应该避免使用。

【讨论】:

  • 不是我的最佳答案。无论如何,我认为通过移动到 INTERFACE 库,您或多或少会很好。
  • 能否请您发布完整的 cmakelists.txt?包括您的建议,仅供将来参考。
  • 删除了我的答案。可能会有更明智的答案
  • 另外,尽管我正在经历这个:stackoverflow.com/questions/26243169/…,但我仍然不明白INTERFACE, PUBLIC, PRIVATE 的含义。
猜你喜欢
  • 2016-06-02
  • 1970-01-01
  • 1970-01-01
  • 2015-04-08
  • 2019-01-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多