swig -c++ 选项破坏纯 C 文件的包装,错误 C3861:unresolved externals
Posted
技术标签:
【中文标题】swig -c++ 选项破坏纯 C 文件的包装,错误 C3861:unresolved externals【英文标题】:swig -c++ option breaks wrapper of pure C files with error C3861:unresolved externals 【发布时间】:2022-01-13 19:35:36 【问题描述】:我正在尝试包装给定的 C API,以便可以使用 SWIG 在 Python 中使用它。该 API 需要从 Python 向其传递回调函数(Python 将 Python 函数传递给 C,该函数从 C 调用并在 Python 中执行)。这可以使用 C++ 和导向器 - %module(directors="1")
来实现。但是,当我将 -c++
选项添加到 swig 设置文件时,它无法在链接阶段找到任何 C 函数。在我添加 -c++
选项之前,它编译得很好并且可以在 Python 中运行,减少所需的回调。
我已经创建了一个非常简单的这种形式的示例演示代码:
add.c:
#include <stdio.h>
int add_func(int x, int y)
return x+y;
添加.h:
int add_func(int x, int y);
添加.i:
%module add
%
#include "add.h"
%
%include "add.h"
setup.py:
from setuptools import setup, Extension
setup(
name='add',
py_modules=['add'],
ext_modules=[
Extension('_add',
sources=['add.c', 'add.i'],
swig_opts=['-c++']
)
]
)
编译命令:
python3 setup.py build_ext --inplace
使用swig_ops=['-c++']
我收到以下错误:
add_wrap.obj : error LNK2001: unresolved external symbol "int __cdecl add_func(int,int)" (?add_func@@YAHHH@Z)
build\lib.win32-3.8\_add.cp38-win32.pyd : fatal error LNK1120: 1 unresolved externals
error: command 'C:\\Program Files (x86)\\Microsoft Visual Studio\\2017\\BuildTools\\VC\\Tools\\MSVC\\14.16.27023\\bin\\HostX86\\x86\\link.exe' failed with exit status 1120
删除swig_ops=['-c++']
后编译正常。
所以问题是你可以在 C++ 和 swig 中使用纯 C 代码吗?如果有怎么办?
系统信息:
SWIG Version 4.0.2 Python 3.8.5 (tags/v3.8.5:580fbb0, Jul 20 2020, 15:43:08) [MSC v.1926 > 32 bit (Intel)] on win32 exe
【问题讨论】:
【参考方案1】:生成的包装器是 C++,但 add.c
编译为 C 并具有 C 链接。错误消息表明它正在寻找带有 C++ 链接的add_func
。
要么将extern "C"
添加到add.h
原型,以便add_wrap.cxx
将查找C 函数,要么将add.c
重命名为add.cpp
,以便编译为C++。
使 C 头文件同时兼容 C 和 C++ 的典型方法是:
#ifdef __cplusplus
extern "C"
#endif
int add_func(int x, int y);
#ifdef __cplusplus
#endif
如果您有无法更改的 C 标头,另一种选择是将其包含在 .i 文件中的 extern "C"
中,以便生成的 add_wrap.cxx
将 C 链接用于外部函数:
%module add
%
extern "C"
#include "add.h"
%
%include "add.h"
【讨论】:
以上是关于swig -c++ 选项破坏纯 C 文件的包装,错误 C3861:unresolved externals的主要内容,如果未能解决你的问题,请参考以下文章
如何使用纯 Python 扩展 API (python3) 包装 C++ 对象?
将 python 函数传递给 SWIG 包装的 C++ 代码
使用 SWIG 为 Python 包装 C++。 “向量”未声明