c++ - 带有 CMake 的 Swig 无法找到标头包含
问题描述
我正在尝试使用 CMake 运行 swig,我得到了
java.i:9: Error: Unable to find 'api.h'
java.i:10:Error: Unable to find 'TestStruct.h'
我试过设置USE_LIBRARY_INCLUDE_DIRECTORIES
, SWIG_USE_TARGET_INCLUDE_DIRECTORIES
, SWIG_USE_LIBRARY_INCLUDE_DIRECTORIES
, 没有任何运气。我可能无法理解正在发生的事情。我的理解是我正在链接到api
目标,因此这些包含目录应该是可见的。
注意:如果我将这些标头复制到调用 swig 的构建目录中,它会起作用。
任何信息都会有所帮助。谢谢。
java.i
%module example
%include "std_string.i"
%{
/* Put header files here or function declarations like below */
#include "api.h"
extern TestStruct TestFunc();
%}
%include "api.h"
%include "TestStruct.h"
extern TestStruct TestFunc();
swig 目标的 CMakeLists.txt
find_package(SWIG REQUIRED)
include(${SWIG_USE_FILE})
find_package(Java REQUIRED)
find_package(JNI REQUIRED)
set_property(SOURCE java.i PROPERTY CPLUSPLUS ON)
swig_add_library(javaExample
TYPE SHARED
LANGUAGE java
SOURCES java.i)
target_include_directories(javaExample PRIVATE ${JNI_INCLUDE_DIRS})
target_link_libraries(javaExample PRIVATE api)
api 目标的 CMakeLists.txt
add_library( api SHARED
inc/api.h
src/api.cpp
)
target_include_directories( api
PUBLIC
inc
)
target_link_libraries( api
PUBLIC
FooTypes
PRIVATE
FooBar
)
add_subdirectory(src/FooBar)
解决方案
发现了问题。不幸的是,我使用的是 cmake 3.10 而不是最新的(cmake 的默认 apt repo 是旧的?)。升级到3.17,没有问题。
所需要的只是:
set_property(TARGET javaExample PROPERTY SWIG_USE_TARGET_INCLUDE_DIRECTORIES TRUE)