Зависимость Makefile при создании ссылок на общие библиотеки - PullRequest
0 голосов
/ 01 июня 2018

В проекте у меня уже есть общая библиотека, которая называется, скажем, «myshare».Библиотека уже создана как «libmyshare.so.1.0.0», и ее расположение относительно make-файла по относительному адресу «adir / lib».

В make-файле я хочу создать символические ссылки дляобщая библиотека с именами «libmyshare.so.1» и «libmyshare.so».Чтобы сделать это в make-файле, у меня есть следующие строки:

MYSHAREL = ./adir/lib/libmyshare.so.1.0.0
MYSHAREL1 = ./adir/lib/libmyshare.so.1
MYSHAREL2 = ./adir/lib/libmyshare.so
MYSHARELIBS = $(MYSHAREL) $(MYSHAREL1) $(MYSHAREL2)

.PHONY: all
all: myexetarget

myexetarget : various_files $(MYSHARELIBS)
    various_commands_to_make_target

$(MYSHAREL1): $(MYSHAREL)
    @echo "Creating symbolic link $(MYSHAREL1)"
    @ln -s $(MYSHAREL) $(MYSHAREL1)

$(MYSHAREL2): $(MYSHAREL)
    @echo "Creating symbolic link $(MYSHAREL2)"
    @ln -s $(MYSHAREL) $(MYSHAREL2)

Когда я запускаю команду 'make', ссылки на общую библиотеку всегда создаются, даже если они уже существуют и даже когда датаобщая библиотека находится до даты создания уже созданных символических ссылок.Кроме того, когда я пытаюсь на самом деле создать ссылку на разделяемую библиотеку в моей цели, несмотря на опции -L./adir/lib и -lmyshare среди опций компоновщика (не показаны выше), происходит сбой ссылки:

/usr/bin/ld: cannot find -lmyshare

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

1 Ответ

0 голосов
/ 04 июня 2018

Использование ln -s, вероятно, является причиной вашей проблемы.Если из вашего верхнего каталога вы выполняете:

ln -s ./adir/lib/libmyshare.so.1.0.0 ./adir/lib/libmyshare.so.1

(что и делает ваше правило make), создается символическая ссылка в ./adir/lib с именем libmyshare.so.1 и указанием на ./adir/lib/libmyshare.so.1.0.0:

$ cd ./adir/lib
$ ls -l
libmyshare.so.1 -> ./adir/lib/libmyshare.so.1.0.0
libmyshare.so.1.0.0

Итак, ./adir/lib/libmyshare.so.1 фактически указывает на ./adir/lib/adir/lib/libmyshare.so.1.0.0, который не существует.

Вы можете заменить команду ln -s на:

@ln -sr $(MYSHAREL) $(MYSHAREL1)

То же самое дляMYSHAREL2.Опция -r ln создает символические ссылки относительно местоположения ссылки.

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