未知的编译器标志/参数到cpp

时间:2016-10-06 09:13:37

标签: c++ gcc compiler-flags

我正在完成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的手册,但没有找到任何内容

2 个答案:

答案 0 :(得分:4)

反引号

当你在shell命令中看到反引号``之间的东西时,它意味着它是在主命令之前运行的单独命令,并且在主命令中使用它写入标准输出的任何内容。

例如:

rm `cat file_to_delete.txt`

考虑file_to_delete.txt包含&#34; sausage.png&#34; 首先运行cat file_to_delete.txt部分并输出&#34; sausage.png&#34; 然后将其插入主命令,如下所示:

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)将需要使用python代码运行C ++代码。

答案 1 :(得分:4)

什么

 `python-config --cflags --ldflags`

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

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

  

python-config - python C / C ++的输出构建选项   扩展或嵌入

     

- cflags

     

打印C编译器标志。

     

- ldflags

     

打印应传递给链接器的标志。

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

在我的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函数

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

  

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`,因为推荐$(..)而不是POSIX的反引号。您可以在&#34;命令替换&#34;。

部分下方看到rationale