首页 > 解决方案 > 文件名后的 Clang 关键字

问题描述

我的具体查询:

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

此行用于在 mujoco 中构建模拟.cpp

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

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

希望获得更多关于如何理解手册页或在未来找出类似问题的答案的一般建议

标签: c++clang

解决方案


打折一些极端情况,clang|clang++接受与 相同的命令行选项gcc|g++,因为 clang 旨在成为 GCC 几乎所有用途的直接替代品。

您最好查阅GCC 文档以了解 GCC 手册中的命令行选项

理解您发布的命令行中的参数如下:

如果您需要知道某些标志的-flg含义并且不知道在文档中的何处查看,请先查看3.1 选项摘要-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 ...

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

有一些 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。(这是极端情况之一。)


推荐阅读