使用SWIG将CPP转换为Python失败,错误为“错误LNK2001:未解析的外部符号”

2024-06-16 18:02:45 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在尝试创建最简单的cpp到python SWIG示例。
我有一个类(SwigTest),由cpph文件组成,其中有一个公共方法swig_test_connection
swig包装器生成(*.cxx*.py文件)是现成的,
但是当我尝试构建(使用setup.py)时,我得到了一个链接错误:
LINK : error LNK2001: unresolved external symbol PyInit__swig_test

请参阅下面详细的重新生产步骤。

我按照以下指示行事:

我觉得我在这里遗漏了一些基本的东西,所以如果有任何建议,我将不胜感激

系统详细信息

我正在使用Windows 10、python 3.6.7和VS 2019。
我还在一台干净的机器上试用了Windows 10、python 3.6.7和VS 2017,得到了同样的结果

详细的复制步骤

我创建了一个类(SwigTest),其中有一个公共成员方法swig_test_connection:

swig\u测试。h:

//// swig_test.h ////

#ifndef _SWIG_TEST_
#define _SWIG_TEST_

class SwigTest
{
public:
    int swig_test_connection();
};

#endif // !_SWIG_TEST_

swig\u测试。cpp:

//// swig_test.cpp ////

#include "swig_test.h"

int SwigTest::swig_test_connection() {
    return 32;
}

我还创建了一个swigtest.i文件:
swigtest.i

%module swig_test_module
%{
#include "swig_test.h"
%}

%include "swig_test.h"

我将所有这些文件保存在同一文件夹下:

接下来,我通过运行以下命令创建了SWIG包装文件:
swig -python -c++ swigtest.i

这将生成2个SWIG包装文件:

swig_test_module.py
swigtest_wrap.cxx

最后一步是创建setup.py:
setup.py

import os

from distutils.core import setup, Extension


swig_test_module = Extension(
    '_swig_test',
    sources=[
        os.path.join("swigtest_wrap.cxx"),
        os.path.join("swig_test.cpp")
    ]
)

setup(
    name="swig_test",
    version='0.1',
    author="Saar",
    description="""SWIG test""",
    py_modules=["swig_test_module"],
    ext_modules=[swig_test_module]
)

最后,我尝试构建模块:
python setup.py build_ext --inplace

这产生了以下错误:

LINK : error LNK2001: unresolved external symbol PyInit__swig_test

完整错误堆栈跟踪:

running build_ext
building '_swig_test' extension
creating build
creating build\temp.win-amd64-3.6
creating build\temp.win-amd64-3.6\Release
C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\VC\Tools\MSVC\14.26.28801\bin\HostX86\x64\cl.exe /c /nologo /Ox /W3 /GL /DNDEBUG /MT -IC:\Projects\SwigTest\venv\include -IC:\Python367\include -IC:\Python367\include "-IC:\Program Files (x86)\Microsoft
Visual Studio\2019\Community\VC\Tools\MSVC\14.26.28801\include" "-IC:\Program Files (x86)\Windows Kits\NETFXSDK\4.8\include\um" "-IC:\Program Files (x86)\Windows Kits\10\include\10.0.18362.0\ucrt" "-IC:\Program Files (x86)\Windows Kits\10\include\10.0.18362.0\share
d" "-IC:\Program Files (x86)\Windows Kits\10\include\10.0.18362.0\um" "-IC:\Program Files (x86)\Windows Kits\10\include\10.0.18362.0\winrt" "-IC:\Program Files (x86)\Windows Kits\10\include\10.0.18362.0\cppwinrt" /EHsc /Tpswigtest_wrap.cxx /Fobuild\temp.win-amd64-3
.6\Release\swigtest_wrap.obj
swigtest_wrap.cxx
C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\VC\Tools\MSVC\14.26.28801\bin\HostX86\x64\cl.exe /c /nologo /Ox /W3 /GL /DNDEBUG /MT -IC:\Projects\SwigTest\venv\include -IC:\Python367\include -IC:\Python367\include "-IC:\Program Files (x86)\Microsoft
Visual Studio\2019\Community\VC\Tools\MSVC\14.26.28801\include" "-IC:\Program Files (x86)\Windows Kits\NETFXSDK\4.8\include\um" "-IC:\Program Files (x86)\Windows Kits\10\include\10.0.18362.0\ucrt" "-IC:\Program Files (x86)\Windows Kits\10\include\10.0.18362.0\share
d" "-IC:\Program Files (x86)\Windows Kits\10\include\10.0.18362.0\um" "-IC:\Program Files (x86)\Windows Kits\10\include\10.0.18362.0\winrt" "-IC:\Program Files (x86)\Windows Kits\10\include\10.0.18362.0\cppwinrt" /EHsc /Tpswig_test.cpp /Fobuild\temp.win-amd64-3.6\R
elease\swig_test.obj
swig_test.cpp
C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\VC\Tools\MSVC\14.26.28801\bin\HostX86\x64\link.exe /nologo /INCREMENTAL:NO /LTCG /nodefaultlib:libucrt.lib ucrt.lib /DLL /MANIFEST:EMBED,ID=2 /MANIFESTUAC:NO /LIBPATH:C:\Projects\SwigTest\venv\libs /LIBP
ATH:C:\Python367\libs /LIBPATH:C:\Python367 /LIBPATH:C:\Projects\SwigTest\venv\PCbuild\amd64 "/LIBPATH:C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\VC\Tools\MSVC\14.26.28801\lib\x64" "/LIBPATH:C:\Program Files (x86)\Windows Kits\NETFXSDK\4.8\lib\um
\x64" "/LIBPATH:C:\Program Files (x86)\Windows Kits\10\lib\10.0.18362.0\ucrt\x64" "/LIBPATH:C:\Program Files (x86)\Windows Kits\10\lib\10.0.18362.0\um\x64" /EXPORT:PyInit__swig_test build\temp.win-amd64-3.6\Release\swigtest_wrap.obj build\temp.win-amd64-3.6\Release
\swig_test.obj /OUT:C:\Projects\SwigTest\_swig_test.cp36-win_amd64.pyd /IMPLIB:build\temp.win-amd64-3.6\Release\_swig_test.cp36-win_amd64.lib
LINK : error LNK2001: unresolved external symbol PyInit__swig_test
build\temp.win-amd64-3.6\Release\_swig_test.cp36-win_amd64.lib : fatal error LNK1120: 1 unresolved externals
error: command 'C:\\Program Files (x86)\\Microsoft Visual Studio\\2019\\Community\\VC\\Tools\\MSVC\\14.26.28801\\bin\\HostX86\\x64\\link.exe' failed with exit status 1120

任何帮助都将不胜感激,
谢谢,
萨尔


Tags: testbuildincludewindowsfilesprogramwintemp
1条回答
网友
1楼 · 发布于 2024-06-16 18:02:45

如果有人遇到这个问题,, 经过长时间的调试,解决方案非常简单

问题是Extension声明的名称与setup调用中py_modules中的名称不匹配

显然,它应该与前导下划线完全相同:

import os

from distutils.core import setup, Extension


swig_test_module = Extension(
    '_swig_test_module',
    sources=[
        os.path.join("swigtest_wrap.cxx"),
        os.path.join("swig_test.cpp")
    ]
)

setup(
    name="swig_test",
    version='0.1',
    author="Saar",
    description="""SWIG test""",
    py_modules=["swig_test_module"],
    ext_modules=[swig_test_module]
)

相关问题 更多 >