#------------REQUIRED_1 指定CMake最低版本------------# # 这里指定的CMake版本与它的特性(policies)相互关联 # 这意味着它也定义了 CMake 行为的变化 # 务必设置一个合适的 CMake 版本 cmake_minimum_required(VERSION 3.16) #------------REQUIRED_2 指定项目名及项目版本------------# project( WireRoutingProject # 项目名称没有什么特别的用处。这里没有添加任何的目标(target) VERSION 1.0 DESCRIPTION "A project for wire routing" # CMake 3.9+ 特性 # 语言可以是 C,CXX,Fortran,ASM,CUDA(CMake 3.8+),CSharp(3.8+),SWIFT(CMake 3.15+ experimental) LANGUAGES CXX # 默认是C CXX ) #------------REQUIRED_4 指定C++标准------------# # !!!不要在库中使用此方式!!!,使用set_target_properties/set_property来针对目标设置标准 # 设置缓存变量: 设置了 C++ 标准的级别为 17(STRING) ,保存在CMakeCache.txt文件中,此处“”内容会写入为注释 set(CMAKE_CXX_STANDARD 17 CACHE STRING "The C++ standard to use") # 告诉 CMake 使用上述设置 set(CMAKE_CXX_STANDARD_REQUIRED ON) # 关闭了拓展,来明确自己使用了 -std=c++11 还是 -std=g++11 set(CMAKE_CXX_EXTENSIONS OFF) #------------OPTIONAL_1.1 转换.h.in 为.h头文件------------# # configure_file(CMAKE_CURRENT_SOURCE_DIR/{input_file} CMAKE_CURRENT_BINARY_DIR/{output_file}) configure_file(config.h.in config.h) #------------REQUIRED_5.1.1 find_package 添加大型第三方库(通过编译安装及包管理安装)------------# # 添加自定义依赖路径到 CMAKE_PREFIX_PATH (find_package config 模式搜索路径之一) if (APPLE) list(PREPEND CMAKE_PREFIX_PATH /Users/yony/CODE/Dependencies) # MacOS # Settign pkg-config for tinyxml usage set(ENV{PKG_CONFIG_PATH} /opt/homebrew/lib/pkgconfig/) find_package(PkgConfig) pkg_search_module(TINYXML REQUIRED tinyxml) message(STATUS "=== TINYXML_LIBRARIES: ${TINYXML_LIBRARIES}") message(STATUS "=== TINYXML_INCLUDE_DIRS: ${TINYXML_INCLUDE_DIRS}") elseif (WIN32) list(PREPEND CMAKE_PREFIX_PATH D:/SOURCE/Dependencies) # Windows set(CMAKE_TOOLCHAIN_FILE "D:\\vcpkg\\scripts\\buildsystems\\vcpkg.cmake") # vcpkg include(${CMAKE_TOOLCHAIN_FILE}) # 指定 CONFIG 模式,查看 /share//cmake/xxxConfig.cmake 文件名决定查找包名 find_package(tinyxml CONFIG REQUIRED) elseif (UNIX) list(PREPEND CMAKE_PREFIX_PATH /home/yony/PROJECTS/Dependencies) # Linux find_package(tinyxml CONFIG REQUIRED) endif() # 输出 find_package 系统路径和当前指定路径 message(STATUS "CMAKE_SYSTEM_PREFIX_PATH: ${CMAKE_SYSTEM_PREFIX_PATH}") message(STATUS "Self added CMAKE_PREFIX_PATH: ${CMAKE_PREFIX_PATH}") #------------REQUIRED_5.1.2 include 执行.cmake中的ContentFetch模块来引入库------------# # 添加cmake目录到CMAKE_MODULE_PATH,以供 include 方法使用 list(PREPEND CMAKE_MODULE_PATH ${CMAKE_CURRENT_SOURCE_DIR}/cmake) message(STATUS "Self added CMAKE_MODULE_PATH: ${CMAKE_MODULE_PATH}") # include方法:载入并运行来自于指定文件或模块CMAKE_MODULE_PATH下的.cmake代码 # include(libigl) # 特殊地:Libigl提供依赖安装选项:参考libigl/cmake/libigl.cmake # igl_include(core) # igl_include(core) 默认包含igl::core,此行可注释 # igl_include(glfw) # igl_include_optional(glfw) Enable the target igl::glfw add_subdirectory(lib) # 添加子目录,子目录中的CMakeLists.txt将会被执行 # 复制DLL文件到可执行文件目录 # file(COPY ${CMAKE_SOURCE_DIR}/lib/Debug/WireRouting.dll DESTINATION ${PROJECT_BINARY_DIR}/Debug) #------------REQUIRED_3 添加可执行文件------------# # 不要使用file函数中GLOB来收集文件:如果不重新运行 CMake,Make 或者其他的工具将不会知道你是否添加了某个文件 # 相对的,使用aux_source_directory来列表化源文件目录 aux_source_directory(src SRC_DIR) add_executable( ${PROJECT_NAME} # 既是生成的可执行文件的名称,也是创建的 CMake 目标(target)的名称 ${SRC_DIR} ) #------------REQUIRED_5.2 将库链接到目标(通常是一个可执行文件),这个命令告诉 CMake 在构建目标时需要链接哪些库------------# # target_link_libraries(${PROJECT_NAME} PUBLIC {lib_name1} {lib_name1} ...) # 根据包管理工具在系统环境变量的情况,以及网络下载的包中CMakeLists.txt的编写情况 # 在这里链接库则可下方target_include_directories中可不添加 /include 或 _INCLUDE_DIRS if (WIN32) target_link_libraries( ${PROJECT_NAME} PUBLIC unofficial-tinyxml::unofficial-tinyxml ${CMAKE_SOURCE_DIR}/build/Debug/WireRoutingLib.lib ) else() target_link_libraries( ${PROJECT_NAME} PUBLIC /opt/homebrew/Cellar/tinyxml/2.6.2/lib/libtinyxml.dylib ${CMAKE_SOURCE_DIR}/build/lib/WireRoutingLib.dylib ) endif() #------------OPTIONAL_1.2 添加生成的config.h头文件所在目录------------# # 为目标添加了一个目录,源码中的 #include "config.h" 将会被解析为 ${PROJECT_BINARY_DIR}/config.h target_include_directories( # PUBLIC 影响当前目标和链接到这个目标的目标(库) # PRIVATE(只影响当前目标,不影响依赖) # INTERFACE(只影响依赖) ${PROJECT_NAME} PUBLIC ${PROJECT_BINARY_DIR} # config.h.in 会生成配置在 build 目录 ${CMAKE_SOURCE_DIR}/include ${CMAKE_SOURCE_DIR}/lib/include ${TINYXML_INCLUDE_DIR} # tinyxml库的头文件目录 ${TINYXML_INCLUDE_DIRS} # pkg-config tinyxml dir ) # TODO: 针对 MSVC 解决生成位于msvc_19.29_cxx11_32_md_debug下dll/lib 无法链接到可执行文件的问题