Если у вас нет -L
путь к библиотеке, вы можете указать библиотеку по абсолютному или относительному пути. В последнем случае , независимо от того, что вызывается в библиотеке, в качестве входа компоновщика будет приниматься , если у него нет расширения, которое делает его , как исходный файл. Таким образом
gcc -o prog main.c foo.xyz
компилирует main.c
и ссылку main.o
с библиотекой ./foo.xyz
если в самом деле это один, будь то статический или совместно, которые могут удовлетворить связь.
Позже
(Перед редактированием, вопрос не упомянул вариант -x
).
Введение варианта -x
как в:
gcc -o prog -x c++ main.cpp foo.xyz
вызывает ошибку, как:
foo.xyz:2:1: error: stray ‘`’ in program
/ 0 0 0 0 16 `
^
foo.xyz:3:1: warning: null character(s) ignored
T_Z3foov foo.o/ 0 0 0 644 1544 `
^
foo.xyz:3:4: error: stray ‘\1’ in program
T_Z3foov foo.o/ 0 0 0 644 1544 `
^
...
...
даже когда foo.xyz
фактически является библиотека, которая может удовлетворить связь, идя неортодоксальное имя.
Как и должно быть, потому что -x c++
направляет gcc на последующие входные файлы как источник C++ до дальнейшего уведомления. Как documented
-x язык
Укажите явно язык для следующих входных файлов (а не выпускающих выбирает компилятор по умолчанию на основе суффикса имени файла). Этот параметр применяется ко всем следующим входным файлам до следующей опции -x.
И дальнейшее уведомление не приходит.
Конечно, этого не происходит в случае, например. из:
gcc -o prog -x c++ main.cpp -L. -l:foo.xyz
потому что -l:foo.xyz
не является входным файл, но вариант линкера (который, в сочетании с -L.
, определяет входной файл).
Чтобы избежать этого результата вы должны упасть настойчивое, что foo.xyz
является С ++ исходный файл, отменив -x c++
до того, как будет достигнуто, как:
gcc -o prog -x c++ main.cpp -x none foo.xyz
Как указано:
-x ни
Отключить любую спецификацию языка, чтобы последующие файлы обрабатывались в соответствии с их файлом суффиксы имен (как они есть, если -x вообще не используется).
Это не работает для меня ... хммм ... возможно, я сбросил некоторые переключатели из приведенного выше примера. Позвольте мне изменить это. – einpoklum
Хорошо, сделайте, пожалуйста, см. Edit. – einpoklum
Удивительный, спасибо. Я не понимал, что могу - дважды. Итак, в случае, если вам интересно, [здесь] (http://stackoverflow.com/a/40665580/1593077) является мотивацией (хотя на самом деле имя библиотеки заканчивается '.so'). – einpoklum