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

Unresolved external symbol building Python module

本文关键字:构建 Python 模块 符号 外部      更新时间:2023-10-16

我终于开始将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.0VCBINcl.exe /c /nologo /Ox /MD /W3 /GS- /DNDEBUG -IC:boost_1_55_0 -I..extglm-0.9.4.4 -IC:Python27include -IC:Python27PC /Tp../mandala/python_mgr.cpp /Fobuildtemp.win32-2.7Release../mandala/python_mgr.obj
python_mgr.cpp
C:Program Files (x86)Microsoft Visual Studio 12.0VCINCLUDExlocale(337) : warning C4530: C++ exception handler used, but unwind semantics are not enabled. Specify /EHsc
c:python27includepymath.h(22) : warning C4273: 'round' : inconsistent dll linkage
        C:Program Files (x86)Microsoft Visual Studio 12.0VCINCLUDEmath.h(516) : see previous definition of 'round'
C:Program Files (x86)Microsoft Visual Studio 12.0VCBINlink.exe /DLL /nologo /INCREMENTAL:NO /LIBPATH:C:boost_1_55_0stagelib /LIBPATH:C:Python27libs /LIBPATH:C:Python27PCbuild /EXPORT:inithello buildtemp.win32-2.7Release../mandala/python_mgr.obj /OUT:buildlib.win32-2.7hello.pyd /IMPLIB:buildtemp.win32-2.7Release../mandalahello.lib /MANIFESTFILE:buildtemp.win32-2.7Release../mandalahello.pyd.manifest
   Creating library buildtemp.win32-2.7Release../mandalahello.lib and object buildtemp.win32-2.7Release../mandalahello.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
buildlib.win32-2.7hello.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', '..extglm-0.9.4.4'],
        library_dirs=['C:\boost_1_55_0stagelib'])
    ])

提前感谢您的任何帮助!

您收到链接器错误,抱怨:

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

这是你的这个类指针,"mandala::app"结构和退出函数。

struct mandala::app_t mandala::app

这意味着你编译的目标文件或"模块",python_mgr.obj,你编译了,不识别这个,曼陀罗,应用程序或出口是什么,

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

因为它不包含此类的编译代码、"app"结构和相应的"exit"调用。(请注意,在您的情况下,this 调用是隐式的,但仍在使用。

您需要将它们添加到模块中或将它们编译为单独的模块并链接它。