Как я могу сделать свое приложение для связи библиотек независимо от его местоположения? - PullRequest
4 голосов
/ 28 февраля 2012

Я создал общую библиотеку (например, libabc.so) и исполняемый файл (например, myapp), который использует мою общую библиотеку.Я поместил и разделяемую библиотеку, и мой исполняемый файл в мою файловую систему, но когда я запускаю свой исполняемый файл, он выдает мне следующую ошибку

error while loading shared libraries: <target_lib_path>/<mylib>.so cannot open shared object file: No such file or directory.

Теперь моя среда разработки - у меня есть другая целевая файловая система, которая находится в ~/targetfs после сборки моей общей библиотеки я устанавливаю ее в ~/targetfs/usr/local/abc/lib.Во время связывания моего приложения я даю ему

LDFLAGS += -L~/targetfs/usr/local/abc/lib 

Мое приложение работает нормально.Но когда я запускаю свое приложение в среде, где ~/targetfs является моей файловой системой, тогда мое приложение выдает ошибку при загрузке общих библиотек:

/home/user/targetfs/usr/local/abc/lib/libabc.so: can not open shared object file. No such file or directory exist.

Теперь, конечно, путь, по которому мое приложение ищет общую библиотекуэто не существует, но я хочу, чтобы мое приложение не зависело от этого пути, скорее, оно должно искать мою общую библиотеку в расположениях /lib, /usr/lib, /usr/local/lib или LD_LIBRARY_PATH.

Как сделать так, чтобы мое приложение связывало библиотеки независимо от его местоположения?

Ниже приведены файлы сборки для моей общей библиотеки и приложения.

-------------- Makefile общей библиотеки.(Опуская ненужную информацию)

CC              = $(CROSS_COMPILE)gcc
CFLAGS          = -Wall -shared -fpic
LDFLAGS         = -Xlinker --gc-sections --allow-shlib-undefined
LIBRARY         = libabc.so
OBJ_DIR         = obj
SRC_DIR         = src
CHK_DIR_EXISTS  = test -d
MKDIR           = mkdir -p

# Project Source Files
C_SOURCES += $(SRC_DIR)/abc.c
OBJECTS   += $(OBJ_DIR)/abc.o
INCLUDES  += -Iinc                               
$(LIBRARY): $(OBJECTS)
    @echo ""
    @echo "Linking..." $(LIBRARY)
    @$(CC) $(CFLAGS) $(LDFLAGS) $(OBJECTS) -o $(OBJ_DIR)/$(LIBRARY) 

---------- Makefile приложения (Опуская ненужную информацию)

LDFLAGS += $(TARGETFS)/usr/local/abc/lib/libabc.so           \
       -lpthread -lrt

Любые мысли о том, что отсутствует в моемMakefiles.

1 Ответ

5 голосов
/ 28 февраля 2012

Вы можете попросить компоновщика поместить несколько путей поиска в двоичный файл.Вы вводите эти пути поиска с опцией -Wl, rpath = ....

gcc -o abc abc.c 
-L~/targetfs/usr/local/abc/lib 
-labc 
-Wl,-rpath=/usr/local/abc/lib 
-Wl,-rpath=...
-Wl,-rpath=...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...