我正在学习pybind11教程。要编译一个示例,我应该使用以下行:
c++ -O3 -shared -std=c++11 -I <path-to-pybind11>/include `python-config --cflags --ldflags` example.cpp -o example.so我不明白这部分
`python-config --cflags --ldflags`它主要不是关于它的内容,而是关于:它在编译命令中有什么意义?它是否属于-I标志?那些"`“是怎么回事?
我检查了c++/cpp的手册,但没有发现任何东西
发布于 2016-10-06 09:20:39
反引号
当您在shell命令中看到之间的内容时,这意味着它是一个单独的命令,在主命令之前运行,并且在主命令中使用它写入标准输出的任何内容。
例如:
rm `cat file_to_delete.txt`假设file_to_delete.txt包含"sausage.png“,cat file_to_delete.txt部件首先运行并输出"sausage.png”,然后按如下方式插入主命令:
rm sausage.png你的例子做了什么
因此,在您的示例中,python-config --cflags --ldflags是一个独立于c++的命令,它的输出在原始命令中被替换。如果输出-Wall -Wextra -lmath,您的c++命令将以如下方式结束:
c++ -O3 -shared -std=c++11 -I <path-to-pybind11>/include -Wall -Wextra -lmath example.cpp -o example.so结论
因此,python-config命令的要点是提供gcc (c++实际使用gcc)标志,这将需要运行您的C++代码和您的python代码。
发布于 2016-10-06 09:22:25
什么
`python-config --cflags --ldflags`to是执行命令“python c之旗-”并替换输出(即编译命令的额外参数)。
程序python-config为您的代码提供了必要的构建选项。来自python-config文档:
python-config -用于python C/C++扩展或嵌入的输出构建选项 -c标志打印C编译器标志。 - to标志打印应该传递给链接器的标志。
提供这样一个工具是一种常见的方法,这样就可以自动在特定的is系统上找到必要的构建选项,否则就需要用户自己解决问题。
在我的Ubuntu16.04系统上,python-config --cflags --ldflag生成:
-I/usr/include/python2.7 -I/usr/include/x86_64-linux-gnu/python2.7 -fno-严格-混叠-时间-D_FORTIFY_SOURCE=2 -g -fstack-保护-强-Wformat -Werror=format-安全-DNDEBUG -g -fwrapv -O2 -Wall -W严谨-原型-L/usr/lib/python2.7/config-x86_64-linux-gnu -L/usr/lib -lpython2.7 -lpthread -ldl -lutil -lm -Xlinker -导出- -Wl,-O1 -Wl,-b符号-函数
所以,这相当于自己做这件事:
c++ -O3 -shared -std=c++11 -I /include -I/usr/include/python2.7 -I/usr/include/x86_64-linux-gnu/python2.7 -fno-严格-混叠-Wdate time -D_FORTIFY_SOURCE=2 -g -f堆栈-保护-强-Wformat -Werror=格式-安全-DNDEBUG -g -fwrapv -O2 -Wall --shared-原型-L/usr/lib/python2.7/config-x86_64-linux-gnu -L/usr/lib -lpython2.7 -lpthread -ldl -lutil -lm -Xlinker --O1 -Wl,-b符号-函数example.cpp -o example.so
现在,您可以看到为什么助手程序是方便的(它知道需要哪些库以及它们位于哪里等等)。
在相关的说明中,我更喜欢$(python-config --cflags --ldflags)而不是python-config --cflags --ldflags,因为POSIX推荐使用$(..)。您可以在这里看到“命令替换”一节下的理据。
https://stackoverflow.com/questions/39892059
复制相似问题