【问题标题】:Swig with CMake not able to find header includes带有 CMake 的 Swig 无法找到标头包含
【发布时间】:2020-04-10 01:03:04
【问题描述】:

我正在尝试使用 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)

【问题讨论】:

    标签: c++ c cmake swig


    【解决方案1】:

    发现问题。不幸的是,我使用的是 cmake 3.10 而不是最新的(cmake 的默认 apt repo 是旧的?)。升级到 3.17 没有问题。

    只需要:

    set_property(TARGET javaExample PROPERTY SWIG_USE_TARGET_INCLUDE_DIRECTORIES TRUE)

    【讨论】:

    • 是的,这个SWIG_ 属性是在 3.13 版中添加到 CMake 中的。这是docs
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-10-15
    • 1970-01-01
    • 2017-05-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-16
    • 1970-01-01
    相关资源
    最近更新 更多