设置Xcode标志,以便在我的C ++项目中嵌入python

时间:2017-06-01 19:59:37

标签: python c++ xcode cflags ldflags

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

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

#include<Python/Python.h>

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

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

根据我在这里阅读的说明我可以理解:1. Embedding Python in Another Application - 1.6 Compiling and Linking under Unix-like systems和这里:Python/C API Reference Manual - Introduction为了编译它我必须向编译器和链接器添加一些额外的标志

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

$ 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 FlagsBuild 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

1 个答案:

答案 0 :(得分:0)

好的,我想我找到了解决方案。不确定它是否真的是正确的(因为我不是专家,我真的不明白为什么它现在有效),但我还是会发布它。

问题在于,如果您查看此页面中的说明:1. Embedding Python in Another Application - 1.6. Compiling and Linking under Unix-like systems,您可以看到在执行命令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找不到它?我不喜欢知道)。

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

我说“差不多”因为我还必须将代码开头的include#include<Python/Python.h>重命名为#include<Python.h>(也许是因为我使用的是第一个系统默认的Python分发,而第二个我包括Anaconda一个?再次,我不知道。)

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