设置Xcode标志为了在我的C++项目中嵌入python

问题描述:

我试图在我的C++项目中嵌入python。我需要这样做才能使用一些实现Kolmogorov-Smirnov测试的功能,这些功能在C++中不可用。设置Xcode标志为了在我的C++项目中嵌入python

现在我只想看看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. 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标志”的开头添加了-L/Users/user/anaconda3/lib/python3.6/config-3.6m-darwin,并且所有(几乎)编译都很好。

我说“几乎”是因为我也不得不通过也许是因为使用我包括系统默认的Python发行的第一个重命名include在我的代码开始从#include<Python/Python.h>#include<Python.h>(同时与第二I”包括蟒蛇一个?再次,我不知道)。

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