- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
今天我尝试使用“cmake + swig”的组合来为我的代码生成绑定(bind)。基本上它有效:
set(SWIG_EXECUTABLE "/usr/bin/swig")
find_package(SWIG REQUIRED)
include(${CMAKE_CURRENT_SOURCE_DIR}/UseSWIG.cmake)
set(CMAKE_SWIG_FLAGS -package example)
set(CMAKE_SWIG_OUTDIR "${CMAKE_CURRENT_SOURCE_DIR}/example")
set_source_files_properties(native.i PROPERTIES CPLUSPLUS ON)
SWIG_ADD_MODULE(core Java native.i lib.cpp)
include_directories(${CMAKE_CURRENT_SOURCE_DIR})
用这样的 native.i:
%module native
%include "lib.hpp"
%{
#include "lib.hpp"
%}
但如果我更改 lib.hpp
构建系统 cmake build
则不会调用 swig 重新生成代码。所以我必须 touch native.i
才能让它工作,这很烦人。
我发现 swig
的 -M
选项可以生成依赖项,知道如何使用它来修复 UseSWIG.cmake
吗?
UseSWIG.cmake
仅使用 add_custom_command
进行生成,所以我需要以某种方式 add_custom_command
依赖于动态文件集,不是静态的?
最佳答案
我相信我已经找到了解决您的请求的方法。
我目前正在使用一个解决方案,其中添加了所有相关依赖项,以便 SWIG
重新生成接口(interface),无论何时修改任何解析的 header 。
这个想法是制作一个自定义目标,除了删除生成的接口(interface)文件外,它还涉及一个虚拟文件。我在下面为一个名为 fnm
的项目提供了解决方案,其中包含一个包装器 swig_fnm
。
# Method to make swig_fnm.i depend on input headers
execute_process(COMMAND swig -M -python -c++ -I${CMAKE_CURRENT_BINARY_DIR}/.. -I${CMAKE_CURRENT_SOURCE_DIR}/.. swig_fnm.i
WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}
OUTPUT_VARIABLE swig_deps
INPUT_FILE swig_fnm.i)
# Match all lines except the first one until " \"
string(REGEX MATCHALL "\n [^ ]+" temp ${swig_deps})
# Valid dependency extensions
set(valid_ext .h .hpp)
# Dependency list
set(swig_deps_actual)
foreach(t ${temp})
string(STRIP "${t}" t)
# Add to dependency list
if (EXISTS "${t}")
set(filter)
get_filename_component(filter "${t}" EXT)
if (";${valid_ext};" MATCHES ";${filter};")
set(swig_deps_actual ${swig_deps_actual} "${t}")
endif()
endif()
endforeach()
# This makes configure run again, but does not regenerate the SWIG interface.
set_property(DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} APPEND PROPERTY CMAKE_CONFIGURE_DEPENDS ${swig_deps_actual})
# All headers except for the single .i file are ignored
swig_add_module(swig_fnm python swig_fnm.i ${swig_fnm_HEADERS} ${swig_deps_actual})
# Removes generated file (if any of the dependent files are changed)
add_custom_command(
OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/swig.stamp
COMMAND ${CMAKE_COMMAND} -E remove ${swig_generated_file_fullname}
COMMAND ${CMAKE_COMMAND} -E touch ${CMAKE_CURRENT_BINARY_DIR}/swig.stamp
DEPENDS ${swig_deps_actual} # The dependent files
COMMENT "Removing old SWIG generated file" VERBATIM)
# Custom target for establishing dependency
add_custom_target(
swigtrick
DEPENDS ${CMAKE_CURRENT_BINARY_DIR}/swig.stamp)
# Dependency
add_dependencies(_swig_fnm swigtrick)
关于c++ - cmake + 痛饮 + 依赖项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39358420/
今天我尝试使用“cmake + swig”的组合来为我的代码生成绑定(bind)。基本上它有效: set(SWIG_EXECUTABLE "/usr/bin/swig") find_package(S
我正在尝试从使用 SWIG for Python 包装的 C 函数中输出一组值。我尝试做的方式是使用以下类型映射。 伪代码: int oldmain() { float *output = {0,1}
假设 C++ 类结构如下: namespace MainNS { namespace A { class Class { //.
我正在尝试了解 SWIG 的工作原理。假设我有这个简单的 Foo-Bar 类: #include class Bar { public: Bar(); ~Bar(); int bar_
我正在尝试使用 Swig 从 CXX 模块构建 Perl 模块。有多个与此相关的指南: 通用 Swig tutorial带有 Perl 部分 Swig and C++指导 Swig and Perl5
我正在使用 Swig 将 C/C++ 包装到 Java 中。 我有这个结构: struct score { void* goals; uint32_t goals_number; }
我想使用 swig(它是我的模板引擎)插入 JavaScript,以便只有在选择“其他”选项时才会显示以下内容。 Select Switch Manufacturer Cisco N
我对 SWIG ( C + python ) 有一个奇怪的问题 在 C 中,我有一个返回指向结构 elements_t 的指针的函数。我在 python 中调用函数,得到结果(指针)但我无法访问结构的
我正在尝试为 python 创建一个提供 mysql 连接的 swig 包。但是当我尝试在 python 中导入包时,出现以下错误: -> _mod = imp.load_module('_IMysq
给定这组文件: foo.h: #pragma once #include template class Foo { public: T0 m[3]; Foo(const T0
我是 SWIG 的新手。我创建了一个 python 模块来使用 C++ 类。 我的cpp头代码是 渐变复杂.h : class GradedComplex { public: typedef st
我在 C++ 文件中有类似的东西,它们组成了我的 SWIG 模块: class CObject { public: void do() { // som
我正在使用 SWIG 为我的一个 C 库生成 Java 绑定(bind)。但是我在处理 C 指针时遇到了麻烦。下面是一些代码来演示我的问题: calc.h 文件: extern int sum(int
我是 SWIG 的新手,我使用的相机使用 SWIG 在 Python 中封装 C++。这台相机很特别,因为我无法直接获取原始图像。然后我找到/添加一个可以制作快照的 C++ 函数,它是: int Pi
我正在研究如何使用 swig 为我的 python 代码进行 C 扩展。我使用从网站获得的代码作为示例。这是我的代码: example.c #include double My_variable
我正在尝试使用 SWIG 在 Go 中包装一个 C++ 库,但是自从我升级到 Go 1.4.2 后,我在尝试使用该包时遇到了构建错误。 包可以在这里找到: https://bitbucket.org/
我使用 Swig 从 C/C++ 代码生成 Java 代码。 我得到了很多非人类可读的类,有点像“SWIG_p_f_p_......”,等等。 但是,我需要我最终生成的类遵守一些命名规则。 例如: S
我正在尝试使用 SWIG 在 Go 中包装这个库 ( https://github.com/lemire/EWAHBoolArray ),但是自从我升级到 1.4 后我遇到了很多问题 我已成功使用 G
自从我使用 Swig 以来已经有一段时间了,所以这可能是一些愚蠢的错误。 我使用 swig 为一组函数创建了接口(interface),但有些地方不对劲。例如,当我尝试调用 c 中需要 (int *)
我是一名优秀的程序员,十分优秀!