使用 SWIG 到 Python 的 CPP 失败 "error LNK2001: unresolved external symbol"
CPP to Python using SWIG fails with "error LNK2001: unresolved external symbol"
我正在尝试创建最简单的 cpp 到 python SWIG 示例。
我有一个 class (SwigTest
),由 cpp
和 h
文件组成,其中有一个 public 方法 swig_test_connection
.
swig 包装器生成(*.cxx
和 *.py
文件)开箱即用,
但是当我尝试构建(使用 setup.py
)时出现链接错误:
LINK : error LNK2001: unresolved external symbol PyInit__swig_test
请参阅下面的详细重新制作步骤。
我遵循了以下说明:
- http://www.swig.org/Doc1.3/Python.html
- https://david-estevez.gitbooks.io/tutorial-swig/02_wrapping_simple_c++_library.html
- http://web.mit.edu/svn/src/swig-1.3.25/Examples/python/class/
我觉得我在这里缺少一些基本的东西,所以我将不胜感激任何建议。
系统详细信息
我正在使用 Windows 10、python 3.6.7 和 VS 2019。
我还尝试在一台干净的机器上使用 Windows 10、python 3.6.7 和 VS 2017,得到了相同的结果。
详细的重现步骤
我创建了一个 class (SwigTest
),其中包含一个 public 成员方法 swig_test_connection
:
swig_test.h:
//// swig_test.h ////
#ifndef _SWIG_TEST_
#define _SWIG_TEST_
class SwigTest
{
public:
int swig_test_connection();
};
#endif // !_SWIG_TEST_
swig_test.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 Studio19\Community\VC\Tools\MSVC.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 Studio19\Community\VC\Tools\MSVC.26.28801\include" "-IC:\Program Files (x86)\Windows Kits\NETFXSDK.8\include\um" "-IC:\Program Files (x86)\Windows Kits\include.0.18362.0\ucrt" "-IC:\Program Files (x86)\Windows Kits\include.0.18362.0\share
d" "-IC:\Program Files (x86)\Windows Kits\include.0.18362.0\um" "-IC:\Program Files (x86)\Windows Kits\include.0.18362.0\winrt" "-IC:\Program Files (x86)\Windows Kits\include.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 Studio19\Community\VC\Tools\MSVC.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 Studio19\Community\VC\Tools\MSVC.26.28801\include" "-IC:\Program Files (x86)\Windows Kits\NETFXSDK.8\include\um" "-IC:\Program Files (x86)\Windows Kits\include.0.18362.0\ucrt" "-IC:\Program Files (x86)\Windows Kits\include.0.18362.0\share
d" "-IC:\Program Files (x86)\Windows Kits\include.0.18362.0\um" "-IC:\Program Files (x86)\Windows Kits\include.0.18362.0\winrt" "-IC:\Program Files (x86)\Windows Kits\include.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 Studio19\Community\VC\Tools\MSVC.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 Studio19\Community\VC\Tools\MSVC.26.28801\lib\x64" "/LIBPATH:C:\Program Files (x86)\Windows Kits\NETFXSDK.8\lib\um
\x64" "/LIBPATH:C:\Program Files (x86)\Windows Kits\lib.0.18362.0\ucrt\x64" "/LIBPATH:C:\Program Files (x86)\Windows Kits\lib.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
如有任何帮助,我们将不胜感激,
谢谢,
萨尔
如果有人遇到这个问题,
调试了太多时间,解决方法很简单
问题是 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]
)
我正在尝试创建最简单的 cpp 到 python SWIG 示例。
我有一个 class (SwigTest
),由 cpp
和 h
文件组成,其中有一个 public 方法 swig_test_connection
.
swig 包装器生成(*.cxx
和 *.py
文件)开箱即用,
但是当我尝试构建(使用 setup.py
)时出现链接错误:
LINK : error LNK2001: unresolved external symbol PyInit__swig_test
请参阅下面的详细重新制作步骤。
我遵循了以下说明:
- http://www.swig.org/Doc1.3/Python.html
- https://david-estevez.gitbooks.io/tutorial-swig/02_wrapping_simple_c++_library.html
- http://web.mit.edu/svn/src/swig-1.3.25/Examples/python/class/
我觉得我在这里缺少一些基本的东西,所以我将不胜感激任何建议。
系统详细信息
我正在使用 Windows 10、python 3.6.7 和 VS 2019。
我还尝试在一台干净的机器上使用 Windows 10、python 3.6.7 和 VS 2017,得到了相同的结果。
详细的重现步骤
我创建了一个 class (SwigTest
),其中包含一个 public 成员方法 swig_test_connection
:
swig_test.h:
//// swig_test.h ////
#ifndef _SWIG_TEST_
#define _SWIG_TEST_
class SwigTest
{
public:
int swig_test_connection();
};
#endif // !_SWIG_TEST_
swig_test.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 Studio19\Community\VC\Tools\MSVC.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 Studio19\Community\VC\Tools\MSVC.26.28801\include" "-IC:\Program Files (x86)\Windows Kits\NETFXSDK.8\include\um" "-IC:\Program Files (x86)\Windows Kits\include.0.18362.0\ucrt" "-IC:\Program Files (x86)\Windows Kits\include.0.18362.0\share
d" "-IC:\Program Files (x86)\Windows Kits\include.0.18362.0\um" "-IC:\Program Files (x86)\Windows Kits\include.0.18362.0\winrt" "-IC:\Program Files (x86)\Windows Kits\include.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 Studio19\Community\VC\Tools\MSVC.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 Studio19\Community\VC\Tools\MSVC.26.28801\include" "-IC:\Program Files (x86)\Windows Kits\NETFXSDK.8\include\um" "-IC:\Program Files (x86)\Windows Kits\include.0.18362.0\ucrt" "-IC:\Program Files (x86)\Windows Kits\include.0.18362.0\share
d" "-IC:\Program Files (x86)\Windows Kits\include.0.18362.0\um" "-IC:\Program Files (x86)\Windows Kits\include.0.18362.0\winrt" "-IC:\Program Files (x86)\Windows Kits\include.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 Studio19\Community\VC\Tools\MSVC.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 Studio19\Community\VC\Tools\MSVC.26.28801\lib\x64" "/LIBPATH:C:\Program Files (x86)\Windows Kits\NETFXSDK.8\lib\um
\x64" "/LIBPATH:C:\Program Files (x86)\Windows Kits\lib.0.18362.0\ucrt\x64" "/LIBPATH:C:\Program Files (x86)\Windows Kits\lib.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
如有任何帮助,我们将不胜感激,
谢谢,
萨尔
如果有人遇到这个问题, 调试了太多时间,解决方法很简单
问题是 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]
)