使外部项目可用于find_package CMake
Make an external project available for find_package CMake
在我的项目中,我有一个依赖项"A">具有另一个库依赖项"strong>";B",我试图在A之前下载并安装依赖项B,以清除冲突。我正在使用Externalproject_add
、FetchContent_Declare
和install
,但它失败了。
例如
我得到了一个CMakeList.txt,类似于:
FetchContent_Declare( libpng
GIT_REPOSITORY https://github.com/glennrp/libpng.git
GIT_TAG master
UPDATE_DISCONNECTED TRUE
STEP_TARGETS update
)
FetchContent_GetProperties(libpng)
if (NOT libpng_POPULATED)
FetchContent_Populate(libpng)
add_subdirectory("${libpng_SOURCE_DIR}" ${libpng_BINARY_DIR} EXCLUDE_FROM_ALL)
endif()
这个libpng的CMakeList.txt有一行find_package(ZLIB REQUIRED)
,此时我可以手动下载和安装zlib,但由于我正在开发一个库,我希望我的代码能够处理这种依赖关系。此外,我无法修改libpng的CMakeList.txt。所以,我有这个代码,但它仍然失败。
FetchContent_Declare( zlib
GIT_REPOSITORY https://github.com/zlib-ng/zlib-ng.git
GIT_TAG develop
UPDATE_DISCONNECTED TRUE
STEP_TARGETS update
)
FetchContent_GetProperties(zlib)
if (NOT zlib_POPULATED)
FetchContent_Populate(zlib)
add_subdirectory("${zlib_SOURCE_DIR}" ${zlib_BINARY_DIR} EXCLUDE_FROM_ALL)
endif()
install(TARGETS zlib)
我仍然从CMake开始,我一直在学习,但很难找到合适的例子。
那么,如何安装外部项目以使其可用于find_package?
从技术上讲,你可以"修改";png项目。
不幸的是,FetchContent
/add_subdirectory()
,即将第三方作为子项目,不能与find_package()
一起工作。
你应该用类似的东西代替
if(NOT TARGET ZLIB::ZLIB)
find_package(ZLIB)
endif()
即创建一个补丁并将其应用于png 之上
message(CHECK_START "Fetching png")
list(APPEND CMAKE_MESSAGE_INDENT " ")
FetchContent_Declare(
png
GIT_REPOSITORY "https://github.com/glennrp/libpng.git"
GIT_TAG "master"
PATCH_COMMAND git apply ".../patches/png.patch")
# here if you want to force some option(s) (must have CMP0077 to NEW)
#e.g. set(CMAKE_BUILD_SHARED OFF)
FetchContent_MakeAvailable(png)
list(POP_BACK CMAKE_MESSAGE_INDENT)
message(CHECK_PASS "fetched")
CMake-related";问题":https://gitlab.kitware.com/cmake/cmake/-/issues/17735
注意:看一下https://github.com/google/or-tools/blob/master/cmake/dependencies/CMakeLists.txt(抱歉没有png(
注2:关于CMake的东西,madler zlib是未维护的。看看我的补丁;(
相关文章:
- 如何创建一个CMake变量,除非显式重写,否则使用默认值
- 使用C++库在Android项目中修改gradle中的cmake参数,用于插入指令的测试
- CMake-按正确顺序将项目与C运行时对象文件链接
- 使用CMake创建QML插件
- cmake如何在fedora工作站中找到boost静态库包
- 使用CMake检测支持的C++标准
- CMake项目Boost库错误:Boost/config/compiler/gcc.hpp:165:10:致命错误:cs
- 如何使用CMake编译.proto文件来生成.grpcp.pb.cc和.grpc.pb.h文件
- cmake在我的项目中所需的所有静态库都不成功
- 在CMakeLists.txt的安装功能中使用.cmake文件有什么用
- 无法链接 CMake 中的本地库
- libssh 的函数在构建 libssh 时无法在 Qt 和 cmake 错误中找到
- 如何在Ubuntu中使用cmake设置qt4
- 使用cmake从源代码构建MySQL连接器/C++失败(与以前的声明冲突)
- 为什么 cmake 许可证<>样式不包括?
- cmake更新缓存的变量
- 将--whole archive链接器选项与CMake和具有其他库依赖项的库一起使用
- 使外部项目可用于find_package CMake
- 生成MRPT库时cmake配置失败
- 从Visual Studio 2017运行CMake的PACKAGE目标