未知编译器 flag/parameter 到 cpp

Unknown compiler flag/parameter to cpp

我正在完成 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的手册,没找到

反引号

当在 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 命令的要点是提供标志 gccc++ 实际上使用 gcc)将需要 运行 你的 C++使用您的 python 代码进行编码。

什么

 `python-config --cflags --ldflags`

是执行命令 "python-config --cflags --ldflags" 并替换输出(即编译命令的额外参数)。

程序 python-config 为您的代码提供必要的构建选项。 来自 python-config 文档:

python-config - output build options for python C/C++ extensions or embedding

--cflags

print the C compiler flags.

--ldflags

print the flags that should be passed to the linker.

提供这样的工具是一种常见的方法,以便自动找到特定系统上必要的构建选项,否则需要用户自己弄清楚。

在我的 Ubuntu 16.04 系统上,python-config --cflags --ldflag 产生:

-I/usr/include/python2.7 -I/usr/include/x86_64-linux-gnu/python2.7 -fno-strict-aliasing -Wdate-time -D_FORTIFY_SOURCE=2 -g -fstack-protector-strong -Wformat -Werror=format-security -DNDEBUG -g -fwrapv -O2 -Wall -Wstrict-prototypes -L/usr/lib/python2.7/config-x86_64-linux-gnu -L/usr/lib -lpython2.7 -lpthread -ldl -lutil -lm -Xlinker -export-dynamic -Wl,-O1 -Wl,-Bsymbolic-functions

所以,这相当于我自己这样做:

c++ -O3 -shared -std=c++11 -I /include -I/usr/include/python2.7 -I/usr/include/x86_64-linux-gnu/python2.7 -fno-strict-aliasing -Wdate-time -D_FORTIFY_SOURCE=2 -g -fstack-protector-strong -Wformat -Werror=format-security -DNDEBUG -g -fwrapv -O2 -Wall -Wstrict-prototypes -L/usr/lib/python2.7/config-x86_64-linux-gnu -L/usr/lib -lpython2.7 -lpthread -ldl -lutil -lm -Xlinker -export-dynamic -Wl,-O1 -Wl,-Bsymbolic-functions example.cpp -o example.so

现在您可以明白为什么辅助程序很方便了(它可以确定需要什么库以及它们位于何处等)。


在相关说明中,我更喜欢 $(python-config --cflags --ldflags) 而不是 `python-config --cflags --ldflags` 因为 [=40= 建议使用 $(..) 而不是反引号].您可以在此处的 "Command Substitution".

部分下查看 rationale