Відповіді:
Це залежить від самої програми; Операційна система не диктує, чи потрібно замовляти питання.
Набір варіантів GCC настільки колосальний, що я не можу сказати жодним органам влади, чи можете ви поставити будь-який варіант у довільному порядку; вам доведеться прочитати документацію для цього параметра. Однак, загальне правило полягає в тому, що якщо у вас є два або більше взаємовиключних варіантів (наприклад, -O1 -O2
для різних рівнів оптимізації), програми, як правило, приймуть пізніші варіанти порівняно з більш ранніми. Знову ж, це не застосовується Linux.
Проста програма, яка дозволяє вам вказати більшість варіантів у будь-якому порядку ls
. Список всіх файлів в поточній директорії з деталізацією може бути зроблено або ls -la
, ls -al
або ls -l -a
. Однак, ls -l1 (тобто 'el' 'one') не дає такого ж виходу, як ls -1l ('one' 'l'). Це взаємно виключаючі варіанти, і останній, перелічений вище, їде за першим.
Існує також дивна програма, яка застосовує параметри до аргументів по мірі їх надходження. Так, наприклад, ви можете мати гіпотетичний команду , blah -a 1 2 -b 3
де -a
застосовується до всіх трьох аргументів, але -b
відноситься тільки до 3
.
Знову ж таки, це залежить від конкретної програми. Якщо ви колись не впевнені, прочитайте документацію.
Бувають випадки, коли порядок параметрів командного рядка має значення навіть у GCC. Якщо ви пов'язуєтесь зі статичними бібліотеками (.a), то якщо ви вкажете -llib1 -llib2
і є функція, liblib2.a
яка викликає функцію, liblib1.a
яка не була внесена в програму, то посилання буде невдалим із нерозв’язаним символом. Із спільними бібліотеками це не проблема.
Взагалі, як говорили інші, порядок варіантів може чи не може змінити значення. Однак вихід з двох команд нижче є різним, тому порядок аргументів cat
змінює вихід:
cat /etc/passwd /etc/group
cat /etc/group /etc/passwd
Зауважте також, що в Linux (зокрема), GNU getopt()
схильний переупорядкувати командний рядок, щоб усі параметри (починаючи з мінусу) оброблялися перед будь-яким з інших аргументів - якщо ви не використовуєте подвійний тире --
для позначення кінця аргументи або, якщо ви не встановили змінну середовища POSIXLY_CORRECT.
Тільки якщо у вас є два варіанти, які взаємовиключні. Інакше замовлення не має значення.
Звичайно, це може змінюватися залежно від того, як програма була написана, але має застосовуватися до всіх звичайних інструментів * nix.
Важко знати, як вже говорили інші, це може змінити (чи ні).
Добрим правилом є відкриття сторінки man і перегляд першого прикладу та використання цього порядку при введенні аргументу.
Отже, якщо ми подивимось на команду кота (людина кішка):
SYNOPSIS
cat [OPTION] [FILE]...
Здається, доки всі параметри знаходяться перед аргументами файлів, у вас повинно бути добре.
А якщо ми подивимося на звіра gcc (man gcc):
SYNOPSIS
gcc [-c|-S|-E] [-std=standard]
[-g] [-pg] [-Olevel]
[-Wwarn...] [-pedantic]
[-Idir...] [-Ldir...]
[-Dmacro[=defn]...] [-Umacro]
[-foption...] [-mmachine-option...]
[-o outfile] [@file] infile...
Only the most useful options are listed here; see below for the remainder. g++ accepts mostly
the same options as gcc.
Це не так просто зрозуміти як команда кішки :)
Але якщо ви хочете зіграти його безпечно, -c, здається, виходить раніше -O, а потім інфілювати (hello.c), здається, останнім.
gcc -c -O hello.c
Але, як ви вже знаєте, оскільки інші працюють ... це грає дуже безпечно :)
-static-libstdc++
?
ls -al path/to/dir
дійсна, алеls path/to/dir -al
ні. Отжеls
, ви повинні поставити свої параметри перед (необов'язковою) каталогом, вміст якої ви хочете перерахувати.