c++ - 文件名后的 Clang 关键字
问题描述
我的具体查询:
clang -O2 -I../include -L../bin -std=c++11 -lstdc++ -mavx simulate.cpp -lmujoco150 -lglfw.3 -o ../bin/simulate
此行用于在 mujoco 中构建模拟.cpp
作为一个 C++ 初学者,我不明白:
什么是-mavx?我在“man clang”中找不到单个字母标志
大纲是:
概要 clang [选项] 文件名 a|
如果simulate.cpp 是“文件名”,为什么文件名后面有标志-lmujoco150 等?我如何弄清楚这个标志的作用?(它看起来不像标准的clang标志)
希望获得更多关于如何理解手册页或在未来找出类似问题的答案的一般建议
解决方案
打折一些极端情况,clang|clang++
接受与 相同的命令行选项gcc|g++
,因为 clang 旨在成为 GCC 几乎所有用途的直接替代品。
理解您发布的命令行中的参数如下:
-O2
- 标志 =
-O
- 值 = 2
- Doc = 3.10 控制优化的选项
- 标志 =
-I../include
- 标志 =
-I
- 价值 =
../include
- Doc = 3.15 目录搜索选项
- 标志 =
-L../bin
- 标志 =
-L
- 价值 =
../bin
- Doc = 3.15 目录搜索选项
- 标志 =
-std=c++11
- 标志 =
-std
- 价值 =
c++11
- Doc = 3.4 控制 C 方言的选项
- 标志 =
-lstdc++
- 标志 =
-l
- 价值 =
stdc++
- Doc = 3.14 链接选项
- 标志 =
-mavx
- 标志 =
-m
- 价值 =
avx
- 文档 = 3.18.56 x86 选项
- 标志 =
simulate.cpp
: 位置参数,输入源文件-lmujoco150
- 标志 =
-l
- 价值 =
mujoco150
- Doc = 3.14 链接选项
- 标志 =
-lglfw.3
- 标志 =
-l
- 价值 =
glfw.3
- Doc = 3.14 链接选项
- 标志 =
-o ../bin/simulate
- 标志 =
-o
。 - 价值 =
../bin/simulate
- Doc = 3.2 控制输出类型的选项
- 标志 =
如果您需要知道某些标志的-flg
含义并且不知道在文档中的何处查看,请先查看3.1 选项摘要;-flg
使用浏览器的字符串查找工具在此页面中查找,然后点击链接到出现的选项类别的文档-flg
。
如果simulate.cpp 是“文件名”,为什么文件名后面有标志-lmujoco150 等?
与您可能读到的任何其他内容相反,GCC|clang 命令不能总是以以下形式表示:
gcc|clang[++] [OPTION...] FILE...
如果要与程序链接任何库,则使用-lname
选项指定它们。默认情况下,这会指示链接器使用其库搜索算法查找文件libname.so
(共享库)或libname.a
(静态库)中的任何一个,并将找到的第一个此类文件输入到链接中(首选libname.so
,libname.a
如果它同时找到在同一搜索目录中)。
但是在链接器的命令行中,它会忽略一个库,除非它 需要它——即除非库定义了一些它已经链接到程序中的文件引用的未解析符号。因此,库必须出现在依赖它们的文件之后,例如:
gcc|clang[++] [OPTION...] FILE... -lfoo -lbar ...
否则链接将失败,就好像根本没有提到库一样。
有一些 linux 发行版(大致是 RedHat 系列),它们将 clang/GCC 配置为链接共享(但不是静态)库,无论它们是否需要。如果您发布的命令行准确且链接成功,那么您似乎拥有其中一个发行版,因为在输入任何其他文件之前-lstdc++
请求链接(GNU 标准 C++ 库);libstdc++.so
所以链接器在那个时候不可能有任何链接它的需要,例如,如果您的发行版在 Debian 家族中,那么它将被忽略并且链接将失败。要使命令行可移植到两种发行版,请将其更改为:
clang -O2 -I../include -L../bin -std=c++11 -mavx simulate.cpp -lmujoco150 -lglfw.3 -lstdc++ -o ../bin/simulate
或者如果你已经clang++
安装了,那么你应该优先使用它而不是clang
C++ 编译和链接。将命令行更改为:
clang++ -O2 -I../include -L../bin -std=c++11 -mavx simulate.cpp -lmujoco150 -lglfw.3 -o ../bin/simulate
完全删除-lstdc++
,因为clang++
会自动为您链接标准 C++ 库,在正确的位置1。
[1]如果你特别需要 clang 使用 GNU 标准 C++ 库,
libstdc++
而不是使用 LLVM 标准 C++ 库,libc++
即使它可用并且是配置的默认值,然后传递链接选项-stdlib=libstdc++
。相反,如果您需要 clang 使用libc++
,即使libstdc++
可用并且是配置的默认值,然后通过-stdlib=libc++
. 只有clang 支持-stdlib
在 GNU 和 LLVM C++ 库之间进行选择,而不是 GCC。(这是极端情况之一。)
推荐阅读
- polly - 如何取消 Polly 的异步 WaitAndRetryPolicy 上的挂起重试
- node.js - 将部署到 gcloud 的应用程序中 packages.json 中的私有存储库链接
- android - 如何在 android 中使用带有 RxJava api 调用的进度对话框
- mongodb - 如何在mongodb中使用查询和分组
- c++ - 如何使用 3 个按钮对 Arduino 菜单进行编程?
- python-3.x - AttributeError:“KerasTPUModel”对象没有属性“_ckpt_saved_epoch”
- r - 如何创建一个函数来比较数据集中列中的值并返回数据集中其他列的值
- c# - Modbus 功能 0x06
- java - 使用自定义 AuthenticationFailureHandler 时为 302 而不是 200
- python - 如何将属性添加到现有图表