设置 Xcode 标志以便在我的 C++ 项目中嵌入 python
Set Xcode flags in order to embed python in my C++ project
我正在尝试将 python 嵌入到我的 C++ 项目中。我需要这样做才能使用一些实现 C++ 中不可用的 Kolmogorov-Smirnov 测试的函数。
现在我只是想看看 Xcode 是否能够 link 并编译一个嵌入 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 and here: Python/C API Reference Manual - Introduction 为了使其能够编译,我必须向编译器和 linker 添加一些额外的标志。
为了找出我应该添加哪些标志,我在我的终端中 运行 以下两个命令(我包括相应的输出):
$ 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 编译器和 linker,我进入了我的项目设置 window 以及 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
好的,我想我找到了解决办法。不确定它是否真的是正确的(因为我不是专家,我也不太明白现在它起作用的原因),但我还是要 post 它。
问题是,如果您查看此页面中的说明: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
之后,我认为可能是因为链接器找不到我的[=36]所在的目录=] 分布是或类似的东西。
所以我在我的硬盘驱动器中寻找一个文件夹的路径,该文件夹的名称与网页上显示的名称相似,我发现 /Users/user/anaconda3/lib/python3.6/config-3.6m-darwin
是一个名称与以下文件夹非常相似的文件夹的路径我正在寻找的那个,除了文件夹名称末尾的“-darwin”可能是因为我在 macOS 发行版上(也许这就是命令 python3.6-config --ldflags
找不到它的原因?我不知道)。
在此之后我只是在 Xcode 的 "Other Liker Flags" 的开头添加了 -L/Users/user/anaconda3/lib/python3.6/config-3.6m-darwin
并且所有(几乎)都编译得很好。
我说 "almost" 因为我还必须将代码开头的 include
从 #include<Python/Python.h>
重命名为 #include<Python.h>
(可能是因为使用第一个我包括系统默认的 Python 发行版,而第二个我包括 Anaconda 发行版?同样,我不知道)。
无论如何,现在一切都编译得很好,所以我想分享我是如何做到的,以防其他人遇到同样的情况。
我正在尝试将 python 嵌入到我的 C++ 项目中。我需要这样做才能使用一些实现 C++ 中不可用的 Kolmogorov-Smirnov 测试的函数。
现在我只是想看看 Xcode 是否能够 link 并编译一个嵌入 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 and here: Python/C API Reference Manual - Introduction 为了使其能够编译,我必须向编译器和 linker 添加一些额外的标志。
为了找出我应该添加哪些标志,我在我的终端中 运行 以下两个命令(我包括相应的输出):
$ 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 编译器和 linker,我进入了我的项目设置 window 以及 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
好的,我想我找到了解决办法。不确定它是否真的是正确的(因为我不是专家,我也不太明白现在它起作用的原因),但我还是要 post 它。
问题是,如果您查看此页面中的说明: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
之后,我认为可能是因为链接器找不到我的[=36]所在的目录=] 分布是或类似的东西。
所以我在我的硬盘驱动器中寻找一个文件夹的路径,该文件夹的名称与网页上显示的名称相似,我发现 /Users/user/anaconda3/lib/python3.6/config-3.6m-darwin
是一个名称与以下文件夹非常相似的文件夹的路径我正在寻找的那个,除了文件夹名称末尾的“-darwin”可能是因为我在 macOS 发行版上(也许这就是命令 python3.6-config --ldflags
找不到它的原因?我不知道)。
在此之后我只是在 Xcode 的 "Other Liker Flags" 的开头添加了 -L/Users/user/anaconda3/lib/python3.6/config-3.6m-darwin
并且所有(几乎)都编译得很好。
我说 "almost" 因为我还必须将代码开头的 include
从 #include<Python/Python.h>
重命名为 #include<Python.h>
(可能是因为使用第一个我包括系统默认的 Python 发行版,而第二个我包括 Anaconda 发行版?同样,我不知道)。
无论如何,现在一切都编译得很好,所以我想分享我是如何做到的,以防其他人遇到同样的情况。