Swig与CMake结合使用无法找到头文件包含

4

我正在尝试使用CMake运行swig,但遇到了问题。

java.i:9: Error: Unable to find 'api.h'
java.i:10:Error: Unable to find 'TestStruct.h'

我尝试设置了USE_LIBRARY_INCLUDE_DIRECTORIESSWIG_USE_TARGET_INCLUDE_DIRECTORIESSWIG_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)

1个回答

3
发现了问题。不幸的是,我使用的是CMake 3.10而不是最新版本(CMake 的默认 apt 存储库过时了吗?)。升级到3.17后就没有问题了。
所需的全部内容如下:
`set_property(TARGET javaExample PROPERTY SWIG_USE_TARGET_INCLUDE_DIRECTORIES TRUE)`

是的,在CMake 3.13版本中添加了SWIG_属性。这里是文档 - Kevin

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接