Указание ld, где искать каталоги через переменную окружения - PullRequest
8 голосов
/ 09 февраля 2010

Я оцениваю файлы C и C ++ для класса, и это назначение использует библиотеку GSL. Поскольку у меня нет прав root на моем компьютере, моя библиотека GSL установлена ​​в моем домашнем каталоге, и поэтому мне нужно сообщить компиляторам и компоновщикам, где ее найти.

Это не проблема, когда я сам пишу программу, потому что я просто добавляю соответствующие флаги -L и -I в gcc.

Но когда я собираю файлы учеников, я не хочу редактировать каждый их make-файл. Вместо этого я хочу поместить соответствующие каталоги в переменную окружения, чтобы это происходило без проблем.

С этой целью я экспортировал следующие переменные в библиотеку или включил местоположения: C_INCLUDE_PATH, CPLUS_INCLUDE_PATH, LIBRARY_PATH и LD_LIBRARY_PATH

Но когда я компилирую проект студента, с

gcc -Wall -o MC_thread MC_thread.c -lgsl -lgslcblas -lpthread -lm

Я получаю следующую ошибку:

/usr/bin/ld: cannot find -lgsl
collect2: ld returned 1 exit status
make: *** [all] Error 1

Я использую gcc v 4.1.2. Я на самом деле не получаю ошибку, если я использую gcc v 4.4, но я понятия не имею, почему. Мой компоновщик:

ld -V
GNU ld version 2.17.50.0.6-12.el5 20061020.

Ответы [ 4 ]

12 голосов
/ 09 февраля 2010

Вы можете попробовать использовать переменную окружения LIBRARY_PATH

С man gcc (по крайней мере версия 4.4)

       LIBRARY_PATH
           The value of LIBRARY_PATH is a colon-separated list of directories,
           much like PATH.  When configured as a native compiler, GCC tries
           the directories thus specified when searching for special linker
           files, if it can't find them using GCC_EXEC_PREFIX.  Linking using
           GCC also uses these directories when searching for ordinary
           libraries for the -l option (but directories specified with -L come
           first).

А затем используйте LD_LIBRARY_PATH, когда вы запускаете их программы, чтобы компоновщик во время выполнения мог найти библиотеки.

3 голосов
/ 20 февраля 2010

Многие ответы выше предлагают использовать LD_LIBRARY_PATH. Но это неверно, поскольку это переменная окружения для динамического компоновщика (во время выполнения), а не компоновщика компиляции ld.

Правильный способ сделать это - попросить студентов добавить что-то вроде:

-L$(EXTRA_LINK_DIRECTORY)

в своем Makefile в том месте, в котором они определяют правило сборки. Затем, когда вы скомпилируете, сделайте что-то вроде:

экспорт EXTRA_LINK_DIRECORY = / home /...

1 голос
/ 14 февраля 2013

Если вы работаете на 64-битной машине, возможно, это проблема. OMM, gcc 4.1 ищет не пути, указанные в LIBRARY_PATH, а путь /../ lib64. Вам нужно будет указать -L напрямую, или символическую ссылку на каталог lib64 на том же уровне, или связываться со спецификациями gcc.

См. http://gcc.gnu.org/ml/gcc-help/2010-11/msg00360.html и Почему g ++ выглядит в LIBRARY_PATH /../ lib64 и где это описано?

(OMM, это работает с gcc 4.5 без каких-либо проблем, так что я думаю, они исправили это позже.)

0 голосов
/ 17 февраля 2010

Мой совет состоит в том, чтобы студенты поддерживали переменную среды CFLAGS в своих make-файлах, иначе они потерпят неудачу. :) Тогда вы можете экспортировать CFLAGS = "- что угодно".

Или вы можете использовать LD_LIBRARY_PATH.

...