2016-12-04 7 views
1

У меня есть исходный файл, который называется foo.bar, и для этого вопроса нельзя переименовать или связать. Скажем, это исходный файл на C++. Теперь я хочу скомпилировать его и связать его в той же команде, используя библиотеку по адресу path/to/weird_lib_file. Теперь, если имя исходного файла был foo.cpp, я мог бы сделать:Сделать gcc -x somelang ссылкой с произвольным файлом библиотеки без -L'ing его каталога?

gcc -o foo foo.cpp /path/to/weird_lib_file 

и что будет работать. Но если я пишу

gcc -o foo -x c++ foo.cpp /path/to/weird_lib_file 

не работает. Теперь, я мог бы сделать

gcc -o foo -x c++ foo.cpp -L /path/to/ -l:weird_lib_file 

как предложено здесь:

How to link using GCC without -l nor hardcoding path for a library that does not follow the libNAME.so naming convention?

, но по какой-то причине, которую я также не вдаваться в, я предпочел бы не -L эту папку. Могу ли я все же заставить GCC каким-то образом связать себя с этим отдельным файлом библиотеки? Кажется, что -l:/path/to/weird_lib_file не работает.

ответ

1

Если у вас нет -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 вообще не используется).

+0

Это не работает для меня ... хммм ... возможно, я сбросил некоторые переключатели из приведенного выше примера. Позвольте мне изменить это. – einpoklum

+0

Хорошо, сделайте, пожалуйста, см. Edit. – einpoklum

+0

Удивительный, спасибо. Я не понимал, что могу - дважды. Итак, в случае, если вам интересно, [здесь] (http://stackoverflow.com/a/40665580/1593077) является мотивацией (хотя на самом деле имя библиотеки заканчивается '.so'). – einpoklum

 Смежные вопросы

  • Нет связанных вопросов^_^