Python嵌入项目中的VC ++ 6“未解决的外部”
Posted
技术标签:
【中文标题】Python嵌入项目中的VC ++ 6“未解决的外部”【英文标题】:VC++ 6 "unresolved externals" on Python embedding project 【发布时间】:2013-05-08 22:20:57 【问题描述】:我在 Visual C++ 6 上遇到了这个奇怪的链接器错误(我没有选择该工具)。我什至不知道从哪里开始看这个(我的 C++ 经验有限)。这些是错误:
CScripting.obj : error LNK2001: unresolved external symbol "public: virtual __thiscall CScripting::~CScripting(void)" (??1CScripting@@UAE@XZ)
CPythonPg.obj : error LNK2001: unresolved external symbol "private: static struct _object * CPythonPg::pyPgEnv" (?pyPgEnv@CPythonPm@@0PAU_object@@A)
这是CPythonPg.h:
#ifndef _CPYTHONPG_H_
#define _CPYTHONPG_H_
#include <sstream>
#include <Python.h>
#include "pgt.h"
using namespace std;
class CPythonPg
private:
static PyObject* pyPgEnv;
public:
CPythonPg();
~CPythonPg();
protected:
static PyObject* getPyPgEnv(PGTYPE* pgt1, PGTYPE* pgt2);
;
#endif
这是CSripting.h:(我没有创建这个类,除了将实例添加到我的类CPythonPg之外,我无法更改它)
#ifndef _CSCRIPTING_H_
#define _CSCRIPTING_H_
#include <string>
#include <vector>
#include <map>
#include <set>
#include <exception>
#include <sstream>
#include <fstream>
#include <locale>
#include <stdlib.h>
#include <direct.h>
#include <windows.h>
#include <io.h>
#include "pgt.h"
class CPythonPg; // added for python functionality
using namespace std;
class CScripting
private:
string sMod;
string sCust;
string sProf;
string sScript;
CPythonPg* pyInst; // added for python functionality
typedef vector<pair<string, string> > cmdLines_t;
cmdLines_t vCmdLines;
bool bFoundPy; // added for python functionality
public:
typedef map<string, string> catalog_t;
typedef map<string, string> envVars_t;
CScripting();
CScripting(string _sMod, string _sCust, string _sProf, string _sScript, PGTYPE* Pgt1, PGTYPE* Pgt2);
virtual ~CScripting();
int findProcessingScripts();
void run(envVars_t& mEnvVars);
;
#endif
什么可能导致这种类型的错误?
编辑:修正了一些错别字。
【问题讨论】:
您声明了一个名为pyPgEnv
的静态变量,但没有定义它。在您的 CPythonPgsm.cpp 文件中添加 PyObject* CPythonPg::pyPgEnv;
。那应该可以解决第一个错误。第二个错误看起来像您包含 CScripting.h,它声明了 CScripting
的析构函数,但它没有在您的任何 cpp 文件中定义。看起来你需要在 CScripting.cpp 中定义它,或者它可能已经在另一个你不包括的 cpp 中定义?
优秀。我声明了一个静态的pyPgEnv
,但没有定义它。将PyObject* CPythonPg::pyPgEnv;
添加到 CPythonPg.cpp 并解决了该问题。今天学到了新东西。在析构函数CScripting
上,它已经被定义了。当我添加pyPgEnv
的定义时,错误消失了(第一个错误)。谢谢! (如果您将此作为正确答案,我会选择最佳答案)。
【参考方案1】:
这是@Mike Vine 在评论中给出的答案。把它放在这里以获得更好的可见性:
您声明了一个名为 pyPgEnv 的静态变量,但没有定义它。在你的 CPythonPgsm.cpp 文件添加 PyObject* CPythonPg::pyPgEnv;。那应该 修复第一个错误。第二个错误看起来像你包括 CScripting.h 声明了 CScripting 的析构函数,但它 没有在您的任何 cpp 文件中定义。看起来你需要定义 它在 CScripting.cpp 中,或者可能已经在另一个 cpp 中定义 你不包括的东西
【讨论】:
以上是关于Python嵌入项目中的VC ++ 6“未解决的外部”的主要内容,如果未能解决你的问题,请参考以下文章
我可以在 VC++ 6.0 编译的应用程序中嵌入 Strawberry Perl 或在编译器不匹配的情况下使用 Inline::C 吗?
如何以模态方式呈现 VC,然后转到嵌入在导航控制器中的 VC
导航并将字符串传递给嵌入在 TabVC 和 NavigationVC 中的另一个 VC
想把VC++6.0后缀cpp文件的程序移植到stm32芯片里面去,需要注意哪些地方?
Windows下Python3.6.2+Django-1.11.5+httpd-2.4.27-win64-VC14部署网站