原文链接:yuque.com/softdev/cmake/harhs7 libigl仓库:https://github.com/libigl

libigl的CMake工程管理方式有许多优点,本文将介绍它对数据的管理方式。

一、为数据创建一个仓库

libigl为数据专门创建了一个仓库,并把数据放在里面

image.png

二、为数据创建一个Target

创建了一个名为igl::tutorial_data的target

  • igl::tutorial_data的内容只有一个名为TUTORIAL_SHARED_PATH的宏,在C++代码中即可使用这个宏来找到数据包的路径。
  • libigl把这些内容封装在了libigl_tutorial_data.cmake文件中 ```cmake

    —————-如果工程中,已经有名为igl::tutorial_data的Target,则退出

    if(TARGET igl::tutorial_data) return() endif()

message(STATUS “Third-party: creating target ‘igl::tutorial_data’”)

—————-使用CMake的FetchContent命令下载数据包

include(FetchContent) FetchContent_Declare( libigl_tutorial_tata GIT_REPOSITORY https://github.com/libigl/libigl-tutorial-data GIT_TAG c1f9ede366d02e3531ecbaec5e3769312f31cccd ) FetchContent_MakeAvailable(libigl_tutorial_tata)

创建一个动态链接库,名为igl_tutorial_data

add_library(igl_tutorial_data INTERFACE)

重命名Target

add_library(igl::tutorial_data ALIAS igl_tutorial_data)

添加一个宏TUTORIAL_SHARED_PATH

target_compile_definitions(igl_tutorial_data INTERFACE “-DTUTORIAL_SHARED_PATH=\”${libigl_tutorial_tata_SOURCE_DIR}\”” )

  1. 参考链接
  2. 1. [https://cmake.org/cmake/help/latest/module/FetchContent.html](https://cmake.org/cmake/help/latest/module/FetchContent.html)
  3. <a name="QLfXO"></a>
  4. #### 三、在顶级CMake文件中,引入数据包的Target代码
  5. ```cmake
  6. # Download tutorial data
  7. include(libigl_tutorial_data) #即include libigl_tutorial_data.cmake文件

四、使用数据包

第一步:在需要使用此数据包的Target中(如HelloWorld)链接igl::tutorial_data

  1. target_link_libraries(HelloWorld
  2. PRIVATE
  3. igl::tutorial_data
  4. )

第二步:在C++代码中使用TUTORIAL_SHARED_PATH宏即可

  1. igl::readOFF(TUTORIAL_SHARED_PATH "/cube.off", V, F);