Lui*_*uso 3 cmake external-dependencies
我当前的项目需要一个使用 Makefile 构建的库。我想在项目编译期间编译这个库;此功能是 FetchContent 的主要卖点,它与 CMake 依赖项配合得很好。尽管如此,我无法让它与 Makefile 一起使用,也找不到有关如何执行此操作的示例。
FetchContent_Declare(
make_lib
URL http://url/library_code.tar.gz
BUILD_COMMAND ${CMAKE_COMMAND} -E env make -j 8
BUILD_IN_SOURCE true
BINARY_DIR ""
)
FetchContent_GetProperties(make_lib)
if (NOT make_lib_POPULATED)
FetchContent_Populate(make_lib)
# here I would like to declare imported libraries:
add_library(make_lib::libA STATIC IMPORTED GLOBAL)
target_include_directories(make_lib::libA INTERFACE ${make_lib_SOURCE_DIR}/include)
set_property(TARGET make_lib::libA PROPERTY IMPORTED_LOCATION <path to "to be built" lib>)
endif()
Run Code Online (Sandbox Code Playgroud)
make?这些FetchContent_*命令只是从特定的外部资源获取内容或元数据,并填充 CMake 变量;它们实际上并不执行任何配置、构建或安装步骤。因此,在调用 时,与这些步骤相关的任何选项都会被显式忽略FetchContent_Declare()。其中包括以下选项:
CONFIGURE_COMMAND BUILD_COMMAND INSTALL_COMMAND TEST_COMMAND从FetchContent文档中:
该模块允许在配置时通过该
ExternalProject模块支持的任何方法填充内容。虽然ExternalProject_Add()在构建时下载,但该模块立即提供内容,允许配置步骤在、或操作FetchContent等命令中使用内容。add_subdirectory()include()file()
add_subdirectory()这不适用于您的用例,因为外部库中没有 CMake 文件,因此调用会失败。
正如这篇文章中提到的,ExternalProject_Add()对于您的情况更有意义。您的通话可能如下所示:
ExternalProject_Add(make_lib
DOWNLOAD_DIR ${CMAKE_CURRENT_BINARY_DIR}
URL http://url/library_code.tar.gz
UPDATE_COMMAND ""
SOURCE_DIR ${make_lib_SOURCE_DIR}
BUILD_IN_SOURCE 1
CONFIGURE_COMMAND ""
BUILD_COMMAND "make -j8"
INSTALL_COMMAND "${make_lib_install_commands}"
)
add_library(make_lib_libA STATIC IMPORTED GLOBAL)
set_property(TARGET make_lib_libA
PROPERTY IMPORTED_LOCATION
${make_lib_SOURCE_DIR}/path/to/make_lib_libA.a
)
add_dependencies(myOtherLib make_lib)
Run Code Online (Sandbox Code Playgroud)
注意,BUILD_COMMAND这里不会被忽略,而是会make -j8在编译时运行。您还应该能够按照代码的布局声明导入的库。但重要的是,请记住调用add_dependencies()它告诉 CMake 你的目标make_lib已被另一个目标使用;否则,make-lib不会构建。
调用后ExternalProject_Add(),您可以使用ExternalProject_Get_Property()查询外部项目目标的信息。链接的示例显示了如何获取项目的源目录,这对于获取构建库的位置很有用。
| 归档时间: |
|
| 查看次数: |
6601 次 |
| 最近记录: |