CMake ExternalProject构建zlib与libz时链接报权限拒绝错误
问题原因
构建失败和账号权限无关,核心错误是zlib库路径配置传值类型错误:
你给libzip传入的ZLIB_LIBRARY_RELEASE参数值是zlib的库目录${DEPEND_DIR}/zlib/install/lib,但该参数要求传入具体的二进制库文件路径,而非文件夹。链接器尝试将目录作为库文件读取解析时,就会抛出“Permission denied”的报错。
修复方法
优先使用第一种自动查找的方案,容错率更高:
方案1:通过搜索前缀自动定位zlib(推荐)
删除手动指定zlib头文件、库路径的配置,改为将zlib的安装目录加入libzip的包搜索路径,让libzip的CMake脚本自动查找匹配的zlib文件,避免手动写路径适配不同编译环境的问题。
修改后的libzip(原配置里命名为libz,建议改名避免和zlib本身混淆)配置如下:
ExternalProject_Add(libzip URL https://github.com/nih-at/libzip/archive/refs/tags/v1.7.3.zip URL_HASH MD5=98b4817aaa1f382513f08838c7192cbd DEPENDS zlib-install DOWNLOAD_DIR ${DEPEND_DIR}/libzip/repo SOURCE_DIR ${DEPEND_DIR}/libzip/src BUILD_IN_SOURCE 1 CMAKE_ARGS -D ENABLE_BZIP2=OFF -D ENABLE_LZMA=OFF -D ENABLE_GNUTLS=OFF -D ENABLE_MBEDTLS=OFF -D ENABLE_OPENSSL=OFF -D BUILD_REGRESS=OFF -D BUILD_DOC=OFF -D BUILD_EXAMPLES=OFF -D LIBZIP_DO_INSTALL=ON -D BUILD_SHARED_LIBS=ON -D CMAKE_PREFIX_PATH:PATH=${DEPEND_DIR}/zlib/install -D CMAKE_BUILD_TYPE=${CMAKE_BUILD_TYPE} -D CMAKE_INSTALL_PREFIX:PATH=${DEPEND_DIR}/libzip/install )
方案2:手动指定正确的库文件路径
如果需要手动指定依赖路径,需要将ZLIB_LIBRARY_RELEASE指向具体的库文件,而非目录。
你当前使用MinGW编译zlib v1.2.11动态库,安装后对应的导入库路径为${DEPEND_DIR}/zlib/install/lib/libzlib.dll.a,对应修改配置即可:
set(ZLIB_INCLUDE_DIR ${DEPEND_DIR}/zlib/install/include) # 指向具体的库文件,而非目录 set(ZLIB_LIBRARY ${DEPEND_DIR}/zlib/install/lib/libzlib.dll.a) ExternalProject_Add(libzip # 其余参数不变,替换zlib相关的传参为: CMAKE_ARGS # ... 其他原有参数 -D ZLIB_INCLUDE_DIR=${ZLIB_INCLUDE_DIR} -D ZLIB_LIBRARY_RELEASE=${ZLIB_LIBRARY} -D ZLIB_LIBRARY_DEBUG=${ZLIB_LIBRARY} # ... 其他原有参数 )
如果编译的是zlib静态库,对应的库文件名为libzlib.a,替换对应路径即可。
补充说明
- 编写超级构建配置时,尽量通过
CMAKE_PREFIX_PATH传递依赖的安装前缀,不要手动硬编码头文件、库文件的完整路径,避免不同编译器、不同构建类型下库命名规则差异导致的适配问题。 - zlib动态库编译完成后,
zlib1.dll会存放在${DEPEND_DIR}/zlib/install/bin目录下,后续运行依赖libzip的程序时,需要将该目录加入系统PATH,否则会触发找不到dll的运行时错误。
内容的提问来源于stack exchange,提问作者Mostafa Abdelmegeed
相关产品推荐
相关产品推荐

