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
命令的意义在于提供gcc
(c++
实际上使用gcc
)将需要与python代码一起运行c++代码的标志。
What
`python-config --cflags --ldflags`
执行命令"python-config——cflags——ldflags"并替换输出(即编译命令的额外参数)。
程序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- protection -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,- 01 -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- protection -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,- 01 -Wl,-Bsymbolic-functions example.cpp -o example.so
现在您可以看到,为什么帮助程序很方便(它可以计算出需要哪些库以及它们位于何处等)。
在一个相关的注意事项上,我更喜欢$(python-config --cflags --ldflags)
而不是' python-config——cflags——ldflags ',因为POSIX推荐$(..)
而不是反引号。您可以在"命令替换"一节中看到基本原理。
- 如何反转整数参数包
- 使用C++库在Android项目中修改gradle中的cmake参数,用于插入指令的测试
- 如何使用默认参数等选择模板专业化
- 模板参数替换失败,并且未完成隐式转换
- 具有默认模板参数的多态类的模板推导失败
- lambda参数转换为constexpr技巧,然后获取带链接的数组
- 将数组作为参数传递给函数安全吗?作为第三方职能部门,可以探索他们想要的之外的其他元素
- 函数调用中参数的顺序重要吗
- 部分定义/别名模板模板参数
- 模板-模板参数推导:三个不同的编译器三种不同的行为
- 使用不带参数的函数访问结构元素
- 基于另一个成员参数将函数调用从类传递给它的一个成员
- 如何在OMNET++中指定与命令行参数组合的输出文件名
- 如何查看完整的CMD执行命令,包括参数和标志?
- 从单个标志C++获取多个参数
- 在命令行程序中使用布尔值。找不到定义标志并检查它们是否在参数中的方法
- 比特菲尔德,标志数为参数
- OpenCV错误:cvGetMat中有错误的标志(参数或结构字段)(无法识别或不支持的数组类型)
- 在C++中,如何在一个参数中测试多个标志之一和"|"?
- cpp的未知编译器标志/参数