Mac(arm64)静态编译时tiff库无法找到CMath::CMath链接目标问题
问题场景
在Mac ARM64平台下,通过ExternalProject_Add构建静态libtiff库后,执行find_package(TIFF REQUIRED)时触发如下CMake错误:
CMake Error at /path/to/GcoPS-build-static/ep/TIFF/lib/CMake/tiff/TiffTargets.cmake:61 (set_target_properties):
The link interface of target "TIFF::tiff" contains:CMath::CMathbut the target was not found. Possible reasons include:
* There is a typo in the target name. * A find_package call is missing for an IMPORTED target. * An ALIAS target is missing.
问题原因
你使用的libtiff仓库(https://gitlab.com/faxguy/libtiff-tools.git)的master分支最近可能更新了构建逻辑,将系统数学库封装为CMath::CMath目标,但该目标的定义并未被正确导出到TIFF的CMake配置文件中,导致主项目无法识别这个依赖目标。
解决办法
方案一:手动创建CMath::CMath别名目标
在find_package(TIFF)之前,添加以下CMake代码,手动补全缺失的目标定义:
# 为Mac平台创建CMath::CMath接口目标,对应系统数学库m if(NOT TARGET CMath::CMath) add_library(CMath::CMath INTERFACE IMPORTED) if(APPLE) target_link_libraries(CMath::CMath INTERFACE m) endif() endif() # 后续执行find_package find_package (TIFF REQUIRED COMPONENTS tiff)
方案二:禁用libtiff的CMath依赖
修改libtiff构建的缓存参数,强制其不使用CMath目标:
在cmake_cache_args列表中添加:
-DCMAKE_DISABLE_FIND_PACKAGE_CMath:BOOL=ON
完整的cmake_cache_args如下:
set(cmake_cache_args -DBUILD_SHARED_LIBS:BOOL=OFF -Dtiff-docs:BOOL=OFF -Dtiff-test:BOOL=OFF -Dtiff-tools:BOOL=OFF -Djpeg:BOOL=OFF -Doldjpeg:BOOL=OFF -Djpeg12:BOOL=OFF -Dlzma:BOOL=OFF -Dzstd:BOOL=OFF -Dwebp:BOOL=OFF -DCMAKE_DISABLE_FIND_PACKAGE_CMath:BOOL=ON -DCMAKE_INSTALL_PREFIX:PATH=${CMAKE_BINARY_DIR}/ep/${ep} )
方案三:切换到libtiff稳定版本
避免使用最新的master分支,改用成熟的稳定版本tag(比如v4.6.0),修改ExternalProject_Add中的GIT_TAG:
ExternalProject_Add(${ep} PREFIX ${CMAKE_BINARY_DIR}/ep/${ep} GIT_REPOSITORY https://gitlab.com/faxguy/libtiff-tools.git GIT_TAG v4.6.0 # 替换为稳定版本tag CMAKE_ARGS -DCMAKE_BUILD_TYPE=Release CMAKE_CACHE_ARGS ${cmake_cache_args} BUILD_COMMAND ${CMAKE_COMMAND} --build <BINARY_DIR> INSTALL_COMMAND ${CMAKE_COMMAND} --build <BINARY_DIR> --target install )
额外注意
确保TIFF的安装目录被加入到CMAKE_PREFIX_PATH,让find_package能正确找到配置文件:
list(APPEND CMAKE_PREFIX_PATH ${CMAKE_BINARY_DIR}/ep/TIFF)
内容的提问来源于stack exchange,提问作者arthur.sw

