Найти «имя» библиотеки (ключи -L -l) - PullRequest
0 голосов
/ 26 мая 2010

Будучи довольно новым для C ++, у меня есть вопрос, касающийся в основном компилятора g ++ и особенно включения библиотек. Рассмотрим следующий make-файл:

CPPFLAGS= -I libraries/boost_1_43_0-bin/include/ -I libraries/jpeg-8b-bin/include/
LDLIBS= libraries/jpeg-8b-bin/lib/libjpeg.a
# LDLIBS= -L libraries/jpeg-8b-bin/lib -llibjpeg

all: main

main: main.o
    c++ -o main main.o $(LDLIBS)

main.o: main.cpp
    c++ $(CPPFLAGS) -c main.cpp

clean:
    rm -rf *.o main

Как видите, я объявил переменную LDLIBS дважды. Мой код компилируется и работает, если я использую make-файл выше. Но если я деактивирую первую запись LDLIBS и активирую вторую, я получаю ld: library not found for -llibjpeg. Я предполагаю, что мой libjpeg.a просто не называется libjpeg, но носит другое имя.

Есть ли способ узнать имя заданного "библиотечного файла" libsomething.a или libsomething.dyn?


Хорошо, спасибо за все ваши ответы, теперь это работает. Остается один маленький вопрос: принято ли просто исключать "lib" или существует стандартизированный способ узнать имя?

Ответы [ 3 ]

8 голосов
/ 26 мая 2010

Вам не нужна деталь lib, если вы используете переключатель -l.

LDLIBS=-Llibraries/jpeg-8b-bin/lib -ljpeg
#                                    ^^^^

Когда вы пишете -lxxx, компоновщик будет искать библиотеку с именем файла libxxx.<ext> во всех предоставленных путях к библиотекам. Это стандартное соглашение ld, и оно должно выполняться для большинства линкеров на основе UNIX.

3 голосов
/ 26 мая 2010

Нет пробела между -I или -L и следующим путем, а -lxxx подразумевает lib, поэтому

-Llibraries/jpeg-8b-bin/lib -ljpeg

должен сделать трюк.

3 голосов
/ 26 мая 2010

Как правило, если вы используете вторую форму объявления LDLIBS, вам нужно сбросить буквы lib в -llibjpeg, чтобы получить -ljpeg.

...