文件名后的Clang关键字

时间:2018-11-04 09:03:55

标签: c++ clang

我的具体查询:

clang -O2 -I../include -L../bin -std=c++11 -lstdc++ -mavx simulate.cpp   -lmujoco150 -lglfw.3 -o ../bin/simulate

此行用于在mujoco中构建Simulation.cpp

作为C ++初学者,我不明白:

  • 什么是-mavx?我在“ man clang”中找不到单个字母标志

  • 简介是:

    简介        铛[选项]文件名a |

如果simulate.cpp是“文件名”,为什么在文件名后面有标志-lmujoco150等?我如何弄清楚这个标志的作用? (它看起来不像标准的clang标志)

在将来如何理解手册页或找出类似问题的答案方面,我们将不胜感激。

1 个答案:

答案 0 :(得分:2)

折扣一些特殊情况,clang|clang++接受相同的命令行选项 之所以称为gcc|g++,是因为clang旨在成为几乎所有用途的GCC的替代产品。

您最好参考GCC documentation for commandline options中的the GCC Manual

了解发布的命令行中的参数,如下所示:

如果您需要知道某个标记-flg的含义并且不知道在文档中的什么位置,那么 首先看看3.1 Option Summary; 使用浏览器的字符串查找工具在此页面中找到-flg,然后点击文档的链接 -flg出现在选项类别中。

  

如果simulate.cpp是“文件名”,为什么在文件名后还有标志-lmujoco150等?

与您可能读到的其他内容相反,GCC | clang命令不能始终在 形式:

gcc|clang[++] [OPTION...] FILE...

如果要将任何库与程序链接,则使用 -lname选项。默认情况下,这会使用其库搜索来指导链接器进行查找 算法libname.so(共享库)或libname.a(静态库), 并将找到的第一个此类文件输入到链接中(如果同时找到libname.solibname.a,则优先使用gcc|clang[++] [OPTION...] FILE... -lfoo -lbar ... 在同一个搜索目录中。

但是在链接器命令行中的任何地方,它将忽略一个库,除非它 需要它-即除非该库定义了文件引用的一些未解析符号 它已经已经链接到程序中了。因此,库必须出现在文件之后 取决于他们的,例如:

-lstdc++

否则链接将失败,就好像根本没有提到这些库一样。

有一些Linux发行版(大概是RedHat系列),用于配置clang / GCC 链接共享(但不是静态)库(无论是否需要)。如果使用命令行 已发布的内容准确无误,并且链接成功,那么您似乎拥有其中之一 发行版,因为libstdc++.so请求链接clang -O2 -I../include -L../bin -std=c++11 -mavx simulate.cpp -lmujoco150 -lglfw.3 -lstdc++ -o ../bin/simulate (GNU标准C ++库) 在输入任何其他文件之前;因此链接器可能不需要 链接到该点,例如,如果您的发行版在Debian家族中,则 它将被忽略并且链接将失败。使命令行可移植 两种发行版都将其更改为:

clang++

或者如果您已安装clang,则应优先使用clang++ -O2 -I../include -L../bin -std=c++11 -mavx simulate.cpp -lmujoco150 -lglfw.3 -o ../bin/simulate 用于C ++编译和链接。将命令行更改为:

-lstdc++

完全删除clang++,因为libstdc++会在正确的位置 1 自动为您链接标准C ++库。


[1]如果您特别需要clang来使用GNU Standard C ++库libc++,而不使用LLVM Standard C ++库-stdlib=libstdc++,即使它可用并且已配置为默认值,也可以通过链接选项libc++。相反,如果您需要clang使用libstdc++,即使-stdlib=libc++可用且已配置为默认值,也请传递-stdlib。 clang仅支持<{>} 用于在GNU和LLVM C ++库之间进行选择的np.ma.append选项, 不是GCC。 (这是极端情况之一。)