c++中调用python脚本提示 error LNK2001: 无法解析的外部符号 __imp_Py_Initialize等错误的解决方法

本文详细介绍了在使用C++调用Python脚本时遇到的编译错误,特别是关于未解析的外部符号问题。作者分享了在Windows 7 x64系统下,使用VS2010和Python 2.7.8 64位版本时的解决方案,包括检查平台配置和确保Python版本与编译器平台匹配。

原文链接:https://blog.youkuaiyun.com/u014489596/article/details/42124595

 

      最近项目中需要实现一个服务器宕机后短信提醒的功能,个人觉得在使用python 写http请求这块很方便,发短信这块就使用了python,但是c++程序中调用这个脚本时,编译不通过,提示如下错误:

error LNK2001: 无法解析的外部符号 __imp_PyString_FromString
error LNK2001: 无法解析的外部符号 __imp_PyCallable_Check

error LNK2001: 无法解析的外部符号 __imp_PyObject_CallObject
error LNK2001: 无法解析的外部符号 __imp_Py_Initialize

error LNK2001: 无法解析的外部符号 __imp_Py_IsInitialized

error LNK2001: 无法解析的外部符号 __imp_PyImport_Import

error LNK2001: 无法解析的外部符号 __imp_PyModule_GetDict

error LNK2001: 无法解析的外部符号 __imp_PyDict_GetItemString

error LNK2001: 无法解析的外部符号 __imp_PyRun_SimpleStringFlags

error LNK2001: 无法解析的外部符号 __imp_Py_Finalize

fatal error LNK1120: 10 个无法解析的外部命令

       这里我们不提c++中怎么调用python,网上很多例子,以后要是有空,会考虑写一篇文章。先说下我自己的开发环境,win7 x64系统,vs2010,python2.7.8 64位。vs2010工程中属性->c/c++常规->附加包含目录 里面加上自己的python下的include路径。链接器->输入->附加依赖项 中添加python27.lib。然后配置此lib文件的路径,连接器->常规->附加库目录中写上python27lib所在的路径(就是python安装目录下得libs)。搞完后编译不通过,提示上面的错误信息,网上找了很久,基本上没解决问题。

      到底是为什么呢?原来,我在vs中得配置平台是win32,而pthon2.7是64位的,将配置平台改为活动x64后编译通过(平台如何修改:右击项目 -> 属性->最上面的平台修改即可)。

      总结下,要是你得相关头文件和依赖库都已经添加,还是出现上面的问题,不妨看看是不是和我犯了同样的错误,要是似的,两种方法解决

1. python版本换成32位

2.vs中平台设置成x64

希望能帮助到和我遇到同样问题的童鞋们。
 

在使用 Visual Studio 2015 编译项目时,如果遇到链接错误 `LNK2001: 无法解析外部符号 __imp___acrt_iob_func`,这通常与运行时库(CRT)的链接方式有关。该符号 `__imp___acrt_iob_func` 是 Microsoft Visual C++ 运行时库中用于访问标准输入/输出流(stdin、stdout、stderr)的函数指针数组的导入符号。以下是一些常见的解决方法: ### 1. 检查运行时库设置 确保项目的运行时库设置一致。`__imp___acrt_iob_func` 是在多线程 DLL 版本的 CRT(即 `/MD` 或 `/MDd`)中定义的。如果项目或其依赖的库使用了不同的运行时库设置(如 `/MT` 或 `/MTd`),则可能导致链接错误。 - 打开项目属性(右键项目 → 属性) - 转到 **C/C++ → 代码生成** - 确保 **运行时库** 设置为 `/MD`(发布)或 `/MDd`(调试) ### 2. 确保链接正确的 CRT 版本 如果项目中混合使用了不同版本的 CRT(例如一部分使用 VS2015 编译,另一部分使用 VS2017 或更高版本编译),可能会导致符号解析失败。请确保所有依赖的库和项目都使用相同版本的 Visual Studio 编译,并且 CRT 版本一致。 ### 3. 使用 `__acrt_iob_func` 替代旧符号 在某些旧版本的 Windows SDK 或第三方库中,可能仍然引用了旧的 CRT 符号如 `__iob_func` 或 `_iob`,而 VS2015 及以后版本已改为使用 `__acrt_iob_func`。可以尝试在代码中添加如下兼容性定义: ```cpp extern "C" FILE __cdecl *__acrt_iob_func(unsigned index) { return (index < 3) ? (&__iob[index]) : nullptr; } ``` 并在项目中定义 `__iob`: ```cpp FILE __iob[3] = { stdin, stdout, stderr }; ``` ### 4. 更新依赖库 如果错误来源于第三方库(如 SDL、FFmpeg 等),建议使用最新版本的库,或确保这些库是使用与当前项目相同版本的 Visual Studio 编译的。旧版本的预编译库可能不兼容 VS2015 及更高版本的 CRT。 ### 5. 强制链接 CRT 导出符号 可以在项目链接器设置中添加 `/INCLUDE:__imp___acrt_iob_func`,强制链接器保留该符号。打开项目属性: - 转到 **链接器 → 命令行** - 在 **附加选项** 中添加 `/INCLUDE:__imp___acrt_iob_func` ### 6. 使用模块定义文件(.def) 如果项目是 DLL,并且需要导出某些 CRT 符号,可以使用模块定义文件显式导出 `__imp___acrt_iob_func`。例如: ```def EXPORTS __imp___acrt_iob_func ``` 然后在链接器设置中指定该 `.def` 文件。 ### 7. 检查编译器更新和 Windows SDK 版本 确保 Visual Studio 2015 已安装最新的更新补丁(Update 3),并且 Windows SDK 版本与项目兼容。某些旧版本的 SDK 可能缺少对新 CRT 符号的支持。 ---
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值