如何配置CMake让SWIG插件正确识别头文件包含路径?
解决CMake+SWIG找不到外部目录头文件的问题
嘿,我之前折腾CMake和SWIG时也碰到过几乎一模一样的问题,咱们来搞定它!
问题根源
你的.i文件里引用了其他目录的头文件,但CMake生成的SWIG命令里没加上对应的-I<包含目录>参数,导致SWIG在默认路径里找不到那些.iih或者头文件,所以make时就报错了。
具体解决方案
根据你的场景,有几种灵活的处理方式:
1. 给单个SWIG模块添加包含路径
如果你只有某个SWIG模块需要这个外部目录,在定义完SWIG模块后,用SWIG_INCLUDE_DIRECTORIES命令明确指定路径:
# 先定义你的SWIG模块 SWIG_ADD_LIBRARY(your_swig_module LANGUAGE cxx SOURCES your_interface.i) # 添加需要的包含目录,替换成你实际的路径 SWIG_INCLUDE_DIRECTORIES(your_swig_module /home/steve/cmake_games/src/your/include/path)
这个命令会自动把指定目录转换成-I参数,加到SWIG的调用命令里。
2. 设置全局SWIG包含路径(多模块共用)
如果多个SWIG模块都需要用到同一个外部目录,直接设置全局变量SWIG_INCLUDE_DIRS,后续所有SWIG模块都会自动继承这些路径:
set(SWIG_INCLUDE_DIRS /home/steve/cmake_games/src/common/include /another/shared/path ) # 之后定义的SWIG模块都会带上这些-I参数 SWIG_ADD_LIBRARY(module1 LANGUAGE python SOURCES mod1.i) SWIG_ADD_LIBRARY(module2 LANGUAGE cxx SOURCES mod2.i)
3. 关联CMake已有的包含目录
如果你已经通过include_directories在CMake里添加过这些路径,CMake 3.8.1的UseSWIG模块可能不会自动同步,你可以手动把这些变量传进去:
include_directories(/home/steve/cmake_games/src/this/that) SWIG_ADD_LIBRARY(your_module LANGUAGE cxx SOURCES your_interface.i) # 把CMake的包含目录传给SWIG SWIG_INCLUDE_DIRECTORIES(your_module ${INCLUDE_DIRECTORIES})
验证方法
修改完CMakeLists.txt后,重新运行cmake ..生成Makefile,打开Makefile找到SWIG的调用行,你应该能看到类似这样的参数:
swig -I/home/steve/cmake_games/src/this/that ... your_interface.i
如果有这个-I参数,再执行make就应该能找到对应的头文件了。
内容的提问来源于stack exchange,提问作者Steve
相关产品推荐
相关产品推荐

