使用CMake为iOS构建GDAL静态库时编译报错求助
解决GDAL iOS交叉编译时LibKML依赖Boost头文件找不到的问题
问题描述
使用CMake构建GDAL for iOS,配置命令如下:
cmake .. -G Xcode \ -DCMAKE_TOOLCHAIN_FILE=../ios-cmake/ios.toolchain.cmake \ -DPLATFORM=OS64COMBINED \ -DENABLE_BITCODE=1 \ -DCMAKE_INSTALL_PREFIX=../install \ -DPROJ_LIBRARY=/opt/homebrew/opt/proj/lib/libproj.a \ -DPROJ_INCLUDE_DIR=/opt/homebrew/opt/proj/include \ -DCRYPTOPP_LIBRARY=/opt/homebrew/opt/cryptopp/lib/libcryptopp.a \ -DCRYPTOPP_INCLUDE_DIR=/opt/homebrew/opt/cryptopp/include \ -DXercesC_LIBRARY=/opt/homebrew/opt/xerces-c/lib/libxerces-c.a \ -DXercesC_INCLUDE_DIR=/opt/homebrew/opt/xerces-c/include \ -DBUILD_APPS=OFF \ -DBUILD_PYTHON_BINDINGS=OFF \ -DWITH_GDAL_TOOLS=OFF \ -DLIBKML_INCLUDE_DIR=/opt/homebrew/Cellar/libkml/1.3.0_1/include \ -DLIBKML_LIBRARY_DIR=/opt/homebrew/Cellar/libkml/1.3.0_1/lib/libkml.a \ -DBOOST_INCLUDE_DIR=/opt/homebrew/Cellar/boost/1.86.0_2/include \ -DBOOST_LIBRARY_DIR=/opt/homebrew/Cellar/boost/1.86.0_2/lib
配置成功,但执行cmake --build . --config Release时编译ogr_LIBKML目标失败,报错:
fatal error: 'boost/intrusive_ptr.hpp' file not found
问题根源
- 你使用的Boost是Homebrew安装的macOS架构版本,无法在iOS交叉编译环境中被编译器正确识别;
- CMake未将Boost的包含路径传递给LibKML相关的编译目标,导致头文件查找失败。
解决方案
方案1:快速禁用LibKML支持(无需修改依赖)
如果你的GDAL不需要LibKML格式支持,直接在CMake配置命令中添加以下参数,跳过该模块的编译:
-DWITH_LIBKML=OFF
删除原build目录后,重新执行CMake配置和构建命令即可。
方案2:使用iOS版本的Boost并修正CMake参数
若必须保留LibKML功能,需要替换为iOS架构的Boost库:
- 编译iOS版Boost:
使用ios-cmake工具链交叉编译Boost,确保生成的库支持iOS的arm64/x86_64架构。也可以使用第三方预编译的iOS Boost包。 - 更新CMake参数:
将Boost相关路径替换为iOS版本的路径,并强制开启LibKML对Boost的依赖:
(将-DBoost_INCLUDE_DIR=/path/to/ios-boost/include \ -DBoost_LIBRARY_DIR=/path/to/ios-boost/lib \ -DLIBKML_USE_BOOST=ON/path/to/ios-boost替换为实际iOS Boost的安装路径) - 重新构建:
删除build目录,重新执行CMake配置,再进行编译。
方案3:强制添加Boost包含路径到全局编译选项
如果上述方法无效,可以在CMake配置时,将Boost包含路径强制加入全局C++编译选项:
-DCMAKE_CXX_FLAGS="-I/path/to/ios-boost/include ${CMAKE_CXX_FLAGS}"
这样所有编译目标都会自动包含该路径,解决头文件找不到的问题。
内容的提问来源于stack exchange,提问作者Santosh Singh
相关产品推荐
相关产品推荐

