macOS下CMake FetchContent_Declare构建libiio的路径异常问题
解决libiio通过FetchContent构建时的framework路径错误问题
问题重现
我的CMake配置代码如下:
cmake_minimum_required(VERSION 3.10) include(FetchContent) project(qluto4) set(CMAKE_INCLUDE_CURRENT_DIR ON) message(STATUS "Fetching libiio from github") FetchContent_Declare( libiio GIT_REPOSITORY https://github.com/analogdevicesinc/libiio GIT_TAG main ) include_directories(build/_deps/libiio-build) FetchContent_MakeAvailable(libiio)
执行构建时触发以下错误:
... [ 30%] Built target iio [ 31%] Building C object _deps/libiio-build/CMakeFiles/iio-compat.dir/compat.c.o [ 32%] Building C object _deps/libiio-build/CMakeFiles/iio-compat.dir/dynamic-unix.c.o [ 34%] Linking C shared library iio.framework/iio Fixup Current symbolic link /bin/sh: line 0: cd: /Users/myzinsky/Programming/qluto4/build/iio.framework/Versions: No such file or directory make[2]: *** [_deps/libiio-build/iio.framework/Versions/0.99/iio] Error 1 make[2]: *** Deleting file `_deps/libiio-build/iio.framework/Versions/0.99/iio' make[1]: *** [_deps/libiio-build/CMakeFiles/iio-compat.dir/all] Error 2 make: *** [all] Error 2
实际核查发现,iio.framework实际生成在build/_deps/libiio-build/iio.framework路径下,但构建脚本错误地尝试访问build/iio.framework/Versions目录,路径不匹配导致构建失败。
解决方案
针对macOS平台下CMake构建framework的路径偏差问题,可通过以下几种方式修复:
- 指定framework生成路径
在FetchContent_MakeAvailable(libiio)之前添加配置,强制libiio的framework生成到正确的子目录:
set(CMAKE_FRAMEWORK_INSTALL_PREFIX "${CMAKE_CURRENT_BINARY_DIR}/_deps/libiio-build" CACHE PATH "Framework install prefix" FORCE)
- 禁用framework,改用标准动态库
如果不需要framework格式,直接强制生成普通动态库:
set(BUILD_SHARED_LIBS ON) set(CMAKE_FRAMEWORK OFF)
将上述两行添加到FetchContent_Declare之前,让libiio以.dylib形式构建,规避framework路径问题。
- 覆盖libiio自身的构建选项
libiio提供BUILD_FRAMEWORK配置项,可显式关闭:
FetchContent_Declare( libiio GIT_REPOSITORY https://github.com/analogdevicesinc/libiio GIT_TAG main OVERRIDE_FIND_PACKAGE ) set(BUILD_FRAMEWORK OFF CACHE BOOL "Build libiio as framework" FORCE)
通过FORCE参数覆盖libiio内部的默认设置,直接禁用framework构建逻辑。
内容的提问来源于stack exchange,提问作者Matthias
相关产品推荐
相关产品推荐

