使用CMake如何正确链接从源代码编译生成的zfs版本
编译链接问题修复方案
1. Findzfs.cmake 配置(存放路径:项目根目录/cmake/modules/Findzfs.cmake)
include(FindPackageHandleStandardArgs) # 查找ZFS头文件路径 find_path(ZFS_INCLUDE_DIR NAMES libzfs.h PATHS /usr/include/libzfs /usr/local/include/libzfs /opt/zfs/include PATH_SUFFIXES libzfs ) # 查找ZFS相关所有依赖库 find_library(ZFS_LIBRARY NAMES zfs PATHS /usr/lib /usr/local/lib /opt/zfs/lib) find_library(ZPOOL_LIBRARY NAMES zpool PATHS /usr/lib /usr/local/lib /opt/zfs/lib) find_library(NVPAIR_LIBRARY NAMES nvpair PATHS /usr/lib /usr/local/lib /opt/zfs/lib) find_library(UUTIL_LIBRARY NAMES uutil PATHS /usr/lib /usr/local/lib /opt/zfs/lib) find_library(M_LIBRARY NAMES m) # 验证核心组件是否找到 find_package_handle_standard_args(zfs REQUIRED_VARS ZFS_INCLUDE_DIR ZFS_LIBRARY ZPOOL_LIBRARY NVPAIR_LIBRARY UUTIL_LIBRARY M_LIBRARY ) if(zfs_FOUND) set(ZFS_INCLUDE_DIRS ${ZFS_INCLUDE_DIR}) # 按链接顺序配置所有依赖库 set(ZFS_LIBRARIES ${ZFS_LIBRARY} ${ZPOOL_LIBRARY} ${NVPAIR_LIBRARY} ${UUTIL_LIBRARY} ${M_LIBRARY} ) # 导入目标,自动传导依赖 if(NOT TARGET zfs::zfs) add_library(zfs::zfs INTERFACE IMPORTED) set_target_properties(zfs::zfs PROPERTIES INTERFACE_INCLUDE_DIRECTORIES "${ZFS_INCLUDE_DIRS}" INTERFACE_LINK_LIBRARIES "${ZFS_LIBRARIES};Threads::Threads;blkid;udev" ) endif() endif() mark_as_advanced(ZFS_INCLUDE_DIR ZFS_LIBRARY ZPOOL_LIBRARY NVPAIR_LIBRARY UUTIL_LIBRARY M_LIBRARY)
2. 项目根目录CMakeLists.txt配置
cmake_minimum_required(VERSION 3.16) project(your_project_name C) # 指定自定义Find模块存放路径 set(CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/cmake/modules" ${CMAKE_MODULE_PATH}) # 查找依赖 find_package(Threads REQUIRED) find_package(blkid REQUIRED) find_package(udev REQUIRED) find_package(zfs REQUIRED) # 替换为你实际的源码文件和目标名称 add_executable(your_target main.c) # 仅需链接zfs::zfs即可,所有依赖自动按正确顺序传导 target_link_libraries(your_target PRIVATE zfs::zfs)
生效说明
- 上述配置已经将
uu_avl_walk_start所属的libuutil、pow所属的libm、以及pthread、libblkid、libudev等所有依赖按正确链接顺序配置到ZFS导入目标中,无需额外手动调整链接参数 - 在提供的复现容器中替换对应文件后,执行
cmake . && make即可完成正常编译链接
内容的提问来源于stack exchange,提问作者FailureGod
相关产品推荐
相关产品推荐

