0

我正在尝试将 python 嵌入到我的 C++ 项目中。我需要这样做才能使用一些在 C++ 中不可用的实现 Kolmogorov-Smirnov 测试的函数。

现在我只是想看看 Xcode 是否能够链接和编译一个嵌入 Python 的简单程序。我试图编译的代码如下:

#include<Python/Python.h>

int main(int argc, const char * argv[]) {

    Py_Initialize();
    PyObject* variable;
    Py_Finalize();
    return 0;
}

据我在此处阅读的说明所理解的:1. 在另一个应用程序中嵌入 Python - 1.6 在类 Unix 系统下编译和链接以及此处:Python/C API 参考手册 -为了编译我必须向编译器和链接器添加一些额外的标志。

为了找出应该添加哪些标志,我在终端中运行了以下两个命令(其中包含相应的输出):

$ python3.6-config --cflags          
-I/Users/user/anaconda3/include/python3.6m -I/Users/user/anaconda3/include/python3.6m -Wno-unused-result -Wsign-compare -Wunreachable-code -DNDEBUG -g -fwrapv -O3 -Wall -Wstrict-prototypes -I/Users/user/anaconda3/include -arch x86_64 -I/Users/user/anaconda3/include -arch x86_64

$ python3.6-config --ldflags
-lpython3.6m -ldl -framework CoreFoundation -Wl,-stack_size,1000000 -framework CoreFoundation

我将用户文件夹的实际名称替换为user.

现在,为了将这些标志添加到 Xcode 编译器和链接器,我进入了我的项目设置窗口,并在下面Build Settings -> Other C Flags添加Build Settings -> Other Linker Flags了我上面报告的标志。

但是当我编译我得到这个错误:

Apple Mach-O Linker (ld) Error Group
clang: error: linker command failed with exit code 1 (use -v to see invocation)

即使我注释了main函数中除return 0.

我不明白我做错了什么。

我正在使用Xcode 8.3.2,我的 Python 发行版是:Python 3.6.1 |Anaconda 4.4.0

4

1 回答 1

0

好的,我想我已经找到了解决方案。不确定它是否真的是正确的(因为我不是专家,我也不明白为什么现在它起作用了),但无论如何我都会发布它。

问题是,如果您查看此页面中的说明:1. 在另一个应用程序中嵌入 Python - 1.6。在类 Unix 系统下编译和链接,您可以看到在执行命令python3.6-config --ldflags时输出包含一个标志-L/opt/lib/python3.4/config-3.4m,而在我的情况下它没有。

因此,在弄清楚给我链接错误的标志是 之后-lpython3.6m,我认为这可能是由于链接器找不到我的 python 分发所在的目录或类似的东西。

因此,我在硬盘驱动器中查找了一个文件夹的路径,该文件夹的名称与网页上显示的名称相似,我发现这/Users/user/anaconda3/lib/python3.6/config-3.6m-darwin是一个名称与我正在寻找的文件夹非常相似的文件夹的路径,除了文件夹名称末尾的“-darwin”可能存在,因为我使用的是 macOS 发行版(也许这就是命令python3.6-config --ldflags找不到它的原因?我不知道)。

在此之后,我刚刚-L/Users/user/anaconda3/lib/python3.6/config-3.6m-darwin在 Xcode 的“Other Liker Flags”开头添加了所有内容(几乎)编译得很好。

我说“几乎”是因为我还必须将include代码开头的重命名为#include<Python/Python.h>to #include<Python.h>(可能是因为使用第一个我包含了系统默认的 Python 发行版,而第二个包含了 Anaconda 发行版?再次, 我不知道)。

无论如何,现在一切都编译得很好,所以我想分享一下我是如何做到的,以防其他人处于同样的情况。

于 2017-06-02T15:09:32.210 回答