未知编译器 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
命令的要点是提供标志 gcc
(c++
实际上使用 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
我正在完成 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
)将需要 运行 你的 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".