【问题标题】:Using CMake, how to rebuild Swig wrapper when header file changes使用 CMake,如何在头文件更改时重建 Swig 包装器
【发布时间】:2022-01-18 18:33:19
【问题描述】:

我有一个 C++ 库(称为 myfibo),我想使用 CMake 和 Swig 制作一个 Python 绑定模块(称为 myfibopy)。

第一个版本完美运行。但是如果我重命名一个暴露的 C++ 函数,python 模块将不再构建,因为 Swig 包装器 (PYTHON_wrap.cxx) 没有重新生成。

我已经尝试使用 SWIG_USE_LIBRARY_INCLUDE_DIRECTORIES 解释 here 但没有成功。

我做错了什么?

这是重现错误的玩具示例:

目录树

.
├── CMakeLists.txt
├── myfibo
│   ├── CMakeLists.txt
│   ├── fibo.cpp
│   └── include
│       └── fibo.hpp
└── myfibopy
    ├── CMakeLists.txt
    └── fibo.i

fibo.hpp

#pragma once
void fib(int n);

fibo.cpp

#include "fibo.hpp"
#include <iostream>

void fib(int n)
{
  int a = 0;
  int b = 1;
  while (a < n)
  {
    std::cout << a << " ";
    a = b;
    b = a+b;
  }
  std::cout << std::endl;
}

fibo.i

%module myfibopy

%include fibo.hpp
%{
  #include "fibo.hpp"
%}

./CMakeLists.txt

project(myfibopy)      

cmake_minimum_required(VERSION 3.15) 

add_subdirectory(myfibo)
add_subdirectory(myfibopy)

myfibo/CMakeLists.txt

add_library(myfibo SHARED fibo.cpp)
target_include_directories(myfibo
  PUBLIC
    $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include>
    $<INSTALL_INTERFACE:include>   # unused 
)

myfibopy/CMakeLists.txt

find_package(PythonLibs 3 REQUIRED)
include_directories(${PYTHON_INCLUDE_PATH})

find_package(SWIG 4.0 REQUIRED)
include(${SWIG_USE_FILE})

set(SRC fibo.i)

set_source_files_properties(${SRC} PROPERTIES CPLUSPLUS ON)

swig_add_library(myfibopy LANGUAGE python SOURCES ${SRC})

target_link_libraries(myfibopy PUBLIC myfibo)

# See https://gitlab.kitware.com/cmake/cmake/-/issues/18003
set_target_properties(myfibopy PROPERTIES SWIG_USE_TARGET_INCLUDE_DIRECTORIES TRUE)

第一次编译

> cmake -Bbuild -H.
   [...]
> cmake --build build
   [...]

完美。现在,build 目录存在,我可以使用myfibopy 模块。

在 fibo.hpp 和 fibo.cpp 中将 fib 重命名为 fib2

> cmake --build build
Consolidate compiler generated dependencies of target myfibo
[ 20%] Building CXX object myfibo/CMakeFiles/myfibo.dir/fibo.cpp.o
[ 40%] Linking CXX shared library libmyfibo.so
[ 40%] Built target myfibo
[ 60%] Built target myfibopy_swig_compilation
Consolidate compiler generated dependencies of target myfibopy
[ 80%] Building CXX object myfibopy/CMakeFiles/myfibopy.dir/CMakeFiles/myfibopy.dir/fiboPYTHON_wrap.cxx.o
./build/myfibopy/CMakeFiles/myfibopy.dir/fiboPYTHON_wrap.cxx: In function ‘PyObject* _wrap_fib(PyObject*, PyObject*)’:
./build/myfibopy/CMakeFiles/myfibopy.dir/fiboPYTHON_wrap.cxx:2968:3: error: ‘fib’ was not declared in this scope
   fib(arg1);
   ^~~
./build/myfibopy/CMakeFiles/myfibopy.dir/fiboPYTHON_wrap.cxx:2968:3: note: suggested alternative: ‘fib2’
   fib(arg1);
   ^~~
   fib2
myfibopy/CMakeFiles/myfibopy.dir/build.make:75: recipe for target 'myfibopy/CMakeFiles/myfibopy.dir/CMakeFiles/myfibopy.dir/fiboPYTHON_wrap.cxx.o' failed
make[2]: *** [myfibopy/CMakeFiles/myfibopy.dir/CMakeFiles/myfibopy.dir/fiboPYTHON_wrap.cxx.o] Error 1
CMakeFiles/Makefile2:170: recipe for target 'myfibopy/CMakeFiles/myfibopy.dir/all' failed
make[1]: *** [myfibopy/CMakeFiles/myfibopy.dir/all] Error 2
Makefile:90: recipe for target 'all' failed
make: *** [all] Error 2

【问题讨论】:

    标签: python c++ cmake dependencies swig


    【解决方案1】:

    你试过了吗:

    USE_SWIG_DEPENDENCIES
    新版本3.20.
    如果设置为TRUE,则由 swig 工具本身生成隐式依赖项。此属性仅对 Makefile、Ninja、Xcode 和 Visual Studio(Visual Studio 11 2012 及更高版本)生成器有意义。默认值为FALSE
    3.21 新功能:增加了对 Xcode 生成器的支持。
    3.22 新功能:添加了对 Visual Studio 生成器的支持。

    USE_TARGET_INCLUDE_DIRECTORIES
    3.13 版中的新功能。
    如果设置为 TRUE,目标属性 INCLUDE_DIRECTORIES 的内容将被转发到 SWIG 编译器。如果设置为 FALSE 目标属性 INCLUDE_DIRECTORIES 将被忽略。如果未设置,将考虑目标属性SWIG_USE_TARGET_INCLUDE_DIRECTORIES

    src:https://cmake.org/cmake/help/git-stage/module/UseSWIG.html

    【讨论】:

    • 是的,我都尝试了,但是 CMake 函数错误(set_target_properties 代替了set_source_files_properties)。通过在set_source_files_properties 中添加USE_SWIG_DEPENDENCIES TRUE,每次修改 C++ 标头时都会重新构建 swig 包装器!非常感谢您的回答。注意:cmake_minimum_required(VERSION 3.20) # for USE_SWIG_DEPENDENCIES (Makefiles)
    • 非常感谢您的反馈!我也可以用^^
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多