c – 使用CMake仅构建一次外部库

前端之家收集整理的这篇文章主要介绍了c – 使用CMake仅构建一次外部库前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我的C项目包括第三方库的源代码(目前作为git子模块).

我们的主要CMakelists通过使用add_subdirectory将该库添加到项目中,然后将库与主目标链接.

这是我当前的Cmake文件的简化版本:

  1. add_subdirectory(foo)
  2. set(FOO_LIBRARY ${CMAKE_CURRENT_SOURCE_DIR}/libfoo/libfoo.so)
  3.  
  4. add_executable(target main.cpp)
  5. add_dependencies(target foo)
  6. target_link_libraries(target ${FOO_LIBRARY})

这个库需要很长时间才能构建,因为我没有更改它的代码,所以我只需要构建一次(每个构建配置).但是当我清理并重建我的代码时,它还会清理库文件并重新编译它们.

我试图在库的目录中设置属性CLEAN_NO_CUSTOM,但根据文档,它只适用于自定义命令目标.

在CMake中是否有一种机制可以指定此库目标只需生成一次,或者不通过make clean清除?

解决方法

正如@Tsyvarev所说,在你的情况下,ExternalProject_Add比add_subdirectory更好.当你希望项目成为构建系统的重要组成部分时,add_subdirectory很好,因为它创建的目标可以在target_link_libraries()命令的右侧使用,而由ExternalProject_Add创建的目标则不能.

这是我在其中一个项目中使用的方法.您尝试查找所需的库并仅在未找到它时构建它.我使用INTERFACE库将FOO_EXTERNAL转换为target_link_libraries()可接受的目标.

  1. add_library(foo INTERFACE)
  2. find_package(foo ${FOO_VER})
  3. if(NOT foo_FOUND)
  4. include(ExternalProject)
  5. include(GNUInstallDirs)
  6. ExternalProject_Add(FOO_EXTERNAL
  7. SOURCE_DIR "${FOO_SOURCE_DIR}"
  8. BINARY_DIR "${FOO_BINARY_DIR}"
  9. INSTALL_DIR "${FOO_INSTALL_DIR}"
  10. CMAKE_ARGS "-DCMAKE_C_FLAGS=${CMAKE_C_FLAGS}"
  11. "-DCMAKE_CXX_FLAGS=${CMAKE_CXX_FLAGS}"
  12. "-DCMAKE_BUILD_TYPE=${CMAKE_BUILD_TYPE}"
  13.  
  14. "-DCMAKE_INSTALL_PREFIX=${FOO_INSTALL_DIR}"
  15. )
  16.  
  17. add_dependencies(foo FOO_EXTERNAL)
  18. set(foo_LIBRARY
  19. "${FOO_INSTALL_DIR}/${CMAKE_INSTALL_LIBDIR}/${CMAKE_STATIC_LIBRARY_PREFIX}foo${CMAKE_STATIC_LIBRARY_SUFFIX}")
  20. set(foo_INCLUDE_DIR "${FOO_INSTALL_DIR}/include")
  21. endif()
  22.  
  23. target_link_libraries(foo INTERFACE ${foo_LIBRARY})
  24. target_include_directories(foo INTERFACE ${foo_INCLUDE_DIR})

猜你在找的C&C++相关文章