未解析的外部符号构建Python模块

时间:2015-04-20 10:06:48

标签: python c++

我终于开始将Python集成到我的程序中了;我取得了很好的进步,但我已经打了(希望)一个最后的障碍。我有以下代码(在python_mgr.cpp内):

void say_hello(const char* name)
{
    std::cout << "Hello, " << name << "!" << std::endl;
}

BOOST_PYTHON_MODULE(hello)
{
    def("say_hello", say_hello);
};

这很好用,我可以构建一个hello.pyd文件并将其导入要使用的程序中。但是,如果我将say_hello的内容更改为其他内容,例如:

void say_hello(const char* name)
{
    mandala::app.exit();
}

我从setup.py得到以下输出:

running build
running build_ext
building 'hello' extension
C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\BIN\cl.exe /c /nologo /Ox /MD /W3 /GS- /DNDEBUG -IC:\boost_1_55_0 -I..\ext\glm-0.9.4.4 -IC:\Python27\include -IC:\Python27\PC /Tp../mandala/python_mgr.cpp /Fobuild\temp.win32-2.7\Release\../mandala/python_mgr.obj
python_mgr.cpp
C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\INCLUDE\xlocale(337) : warning C4530: C++ exception handler used, but unwind semantics are not enabled. Specify /EHsc
c:\python27\include\pymath.h(22) : warning C4273: 'round' : inconsistent dll linkage
        C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\INCLUDE\math.h(516) : see previous definition of 'round'
C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\BIN\link.exe /DLL /nologo /INCREMENTAL:NO /LIBPATH:C:\boost_1_55_0\stage\lib /LIBPATH:C:\Python27\libs /LIBPATH:C:\Python27\PCbuild /EXPORT:inithello build\temp.win32-2.7\Release\../mandala/python_mgr.obj /OUT:build\lib.win32-2.7\hello.pyd /IMPLIB:build\temp.win32-2.7\Release\../mandala\hello.lib /MANIFESTFILE:build\temp.win32-2.7\Release\../mandala\hello.pyd.manifest
   Creating library build\temp.win32-2.7\Release\../mandala\hello.lib and object build\temp.win32-2.7\Release\../mandala\hello.exp
python_mgr.obj : error LNK2019: unresolved external symbol "public: void __thiscall mandala::app_t::exit(void)" (?exit@app_t@mandala@@QAEXXZ) referenced in function __catch$?exec@python_mgr_t@mandala@@QAEXABV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@@Z$0
python_mgr.obj : error LNK2019: unresolved external symbol "struct mandala::app_t mandala::app" (?app@mandala@@3Uapp_t@1@A) referenced in function __catch$?exec@python_mgr_t@mandala@@QAEXABV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@@Z$0
build\lib.win32-2.7\hello.pyd : fatal error LNK1120: 2 unresolved externals
Press any key to continue . . . 

我不知道如何解决这个错误或错误发生的原因。作为参考,这是我的setup.py脚本:

from distutils.core import setup
from distutils.extension import Extension

setup(name='mandala',
    ext_modules=[
        Extension('hello', ['../mandala/python_mgr.cpp'],
        include_dirs=['C:\\boost_1_55_0', '..\ext\glm-0.9.4.4'],
        library_dirs=['C:\\boost_1_55_0\stage\lib'])
    ])

提前感谢您的帮助!

1 个答案:

答案 0 :(得分:1)

您收到链接器错误抱怨:

public: void __thiscall mandala::app_t::exit(void)

这是你的这个类指针,&#34; mandala :: app&#34; struct和exit函数。

struct mandala::app_t mandala::app

这意味着目标文件或&#34;模块&#34;,正如python所称,你编译的python_mgr.obj,无法识别这个,曼荼罗,应用程序或退出是什么,

this->mandala::app.exit();

因为它不包含此类的已编译代码,&#34; app&#34;结构和各自&#34;退出&#34;呼叫。 (请注意,在您的情况下,此调用是隐式的,但仍然使用。)

您需要将这些添加到您的模块或将它们编译成一个单独的模块并链接它。