Ложить ключевые слова после имени файла - PullRequest
0 голосов
/ 04 ноября 2018

Мой конкретный запрос:

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

Эта строка используется для сборки simulate.cpp в mujoco

Как новичок в C ++, я не понимаю:

  • Что такое -mavx? Я не могу найти флаги отдельных букв в "man clang"

  • Синопсис:

    СИНТАКСИС clang [опции] имя файла a |

Если simulate.cpp - это «имя файла», почему после имени файла есть флаги -lmujoco150 и т. Д.? Как мне понять, что делает этот флаг? (Это не похоже на стандартный флаг лязга)

Буду признателен за более общие советы о том, как понимать man-страницы или выяснить ответ на подобные вопросы в будущем

1 Ответ

0 голосов
/ 04 ноября 2018

За исключением нескольких угловых случаев, 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. (Это один из угловых случаев.)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...