我正在尝试在我的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 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
答案 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一个?再次,我不知道。)
无论如何现在一切都编译得很好,所以我想分享我是怎么做的,以防其他人处于同样的情况。