За исключением нескольких угловых случаев, 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.so
до libname.a
, если он находит оба
в том же поисковом каталоге).
Но в любой точке командной строки компоновщика он будет игнорировать библиотеку, если не
это нужно - т.е. если библиотека не определяет некоторые неразрешенные символы, на которые ссылаются файлы
уже связано с программой. Итак, библиотеки должны появляться после файлов
которые зависят от них , например:
gcc|clang[++] [OPTION...] FILE... -lfoo -lbar ...
или связь не будет выполнена, как если бы библиотеки не были упомянуты вообще.
Существует несколько дистрибутивов Linux (примерно, семейство RedHat), которые настраивают clang / GCC
связать общие (но не статические) библиотеки, нужны они или нет. Если командная строка
опубликовал, является точным и ссылки успешно, то, кажется, у вас есть один из тех,
дистрибутивы, потому что -lstdc++
запрашивает связывание libstdc++.so
(библиотека GNU Standard C ++)
до ввода любых других файлов; так что компоновщик не может иметь никакой необходимости
связать его в тот момент, и если ваш дистрибутив был, например, в семействе 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 Standard C ++
libstdc++
и не использовать библиотеку LLVM Standard C ++
libc++
, даже если она доступна и настроена по умолчанию, передайте параметр связывания
-stdlib=libstdc++
. И наоборот, если вам нужен clang для использования
libc++
, даже если
libstdc++
доступен и является настроенным по умолчанию, тогда передайте
-stdlib=libc++
. Параметр
-stdlib
для выбора между библиотеками GNU и LLVM C ++:
only , поддерживаемый clang,
не GCC. (Это один из угловых случаев.)