LIBPATHS не используется в Makefile, не может найти общий объект - PullRequest
3 голосов
/ 11 марта 2010

У меня проблемы с получением примера программы для правильной связи (в данном случае с библиотекой ICU) Когда я делаю 'make', все прекрасно работает. Но когда я запускаю его, он говорит, что не может найти один из .so. Я дважды проверил, все ли они установлены в / usr / local / lib. Я обнаружил, что он искал в / usr / lib. Если я получу символическую ссылку оттуда, чтобы там фактическое местоположение, это работает.

Почему мои LIBPATHS игнорируются или не используются?

Вот Makefile

CC = g++

INCPATHS = -I/usr/local/include

CFLAGS = -c -Wall $(INCPATHS)

LIBPATHS = -L/usr/local/lib/
LIBS = $(LIBPATHS) -licuio -licui18n -licuuc -licuio -licudata

EXECUTABLE = prog

print_linking = echo -e "\033[32m" "Linking: $<" "\033[39m"
print_compiling = echo -e "\033[33m" "Compiling: $<" "\033[39m"
print_cleaning = echo -e "\033[31m" "Cleaning: `pwd`" "\033[39m"


all: main

# [target]: [dependencies]
# <tab> system command
main: main.o
    @$(print_linking)
    @$(CC) -o $(EXECUTABLE) main.o $(LIBS) >> /dev/null

main.o: main.cpp
    @$(print_compiling)
    @$(CC) $(CFLAGS) main.cpp 

clean:
    @$(print_cleaning)
    @rm -rf *.o *~ $(EXECUTABLE)

Ответы [ 3 ]

2 голосов
/ 12 марта 2010

Ваш LIBPATHS сообщает компоновщику, где искать библиотеку при компоновке для разрешения символов.

Во время выполнения вам нужно сообщить загрузчику, где найти библиотеку. Он не знает о том, что произошло во время компиляции. Вы можете использовать переменную LD_LIBRARY_PATH, как упомянуто выше, или зарегистрироваться в /etc/ld.so.conf и его друзьях.

2 голосов
/ 11 марта 2010

Путь к динамическим библиотекам не сохраняется в исполняемом файле по умолчанию. Вы можете либо:

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

  • используйте -Wl, -R path во время ссылки для сохранения пути в исполняемом файле

1 голос
/ 11 марта 2010

Одним из решений является добавление / usr / local / lib к переменной среды LD_LIBRARY_PATH. Вы можете сделать это в вашем .profile или .cshrc

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

Оба решения имеют разные компромиссы в отношении использования исполняемого файла разными пользователями и / или на разных машинах.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...