python - CMake FindPython Oddity:MSVC 未链接 CMakes 指示链接的库
问题描述
我正在测试我的 cmake python-extension 设置实用程序,遇到了一个我似乎无法自行解决的奇怪行为。
从本质上讲,我的CMakeLists.txt
归结为两行:
find_package(Python3 COMPONENTS Interpreter Development REQUIRED)
...
Python3_add_library (${TARGET} SHARED ${SRCS})
当我尝试在调试模式下构建时,MSVC 2019 出现链接器错误:
LINK : fatal error LNK1104: cannot open file 'python37_d.lib'
我正在使用 conda,并且我知道我的 PC 上没有调试库。所以,我开始四处挖掘,看看我是否可以绕过它:主要是为了链接到发布库,python37.lib
......
在这个 stackoverflow 帖子的帮助下,我打印了所有目标属性并找到了相关条目:
mymath LINK_LIBRARIES = Python3::Python
这表明使用了 IMPORTED 目标FindPython3
配置。所以,我也打印了它的属性,发现:
Python3::Python IMPORTED_IMPLIB = C:/Users/tikum/miniconda3/libs/python37.lib
疑惑中,我在build目录下查看了对应的.vcxproj,发现
<ImportLibrary>
C:/Users/tikum/Documents/Python/python-cmaketools-cpython-example/build/src/cpython_example/mymath/Debug/mymath.lib
</ImportLibrary>
所以,我完全没有找到任何链接的痕迹python37_d.lib
......有人可以告诉我这里发生了什么吗?
PS,我正在尝试编译的示例 C 代码是我在网上找到的Martino Pilia示例的逐行副本。
解决方案
您必须取消定义 DEBUG 或 _DEBUG,不记得,在您的代码中包含的 python.h 周围,因为 Python 与 pragma 指令链接。所以它与cmake无关。
像这样的东西
#ifdef DEBUG
#undef DEBUG
#include <Python.h>
#define DEBUG
#else
#include <Python.h>
#endif
应该做的伎俩
推荐阅读
- azure - 无法将 Azure CLI 错误输出存储到变量
- flutter - Flutter InAppWebView 的问题(空白页)
- android - 在 Android 中获取 Sim 号码的任何正宗方法?
- include - Jinja 使用变量作为 Jinja “包含”中使用的文件的名称
- c# - 连续添加100个json
- sql - 如何通过内部联接更新 SQL 中的多个表?
- c# - 我将如何从打印中删除零(我不知道如何表达这个)(C#)
- html - 在spring boot中单击按钮时停止页面刷新
- ios - Swift:如何将自定义高分辨率图像大小调整为按钮?它太大(附截图)
- xcode - 文件 Dev.debug.xcconfig” 无法打开,因为没有这样的文件