Как правильно связать общий объект (файл .so) в make-файле при кросс-компиляции? - PullRequest
0 голосов
/ 14 июля 2020

У меня есть код C ++ на платформе openSuse, который мне нужно скомпилировать для выполнения на другой цели, основанной на linux. Часть кода - это динамическая c библиотека libfoo.so. Я компилирую все с помощью make, а затем копирую скомпилированный исполняемый файл prog вместе с libfoo.so в цель. Когда я затем запускаю исполняемый файл, я получаю несколько ошибок, указывающих, что libfoo не может быть инициализирован. Я пробовал все, что мог найти, чтобы указать исполняемому файлу, где он может найти libfoo.so, но все равно получаю сообщение об ошибке.

Может ли кто-нибудь сказать мне, что я здесь делаю не так? Я чувствую, что это может быть ошибка в Makefile.

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

Моя структура каталогов на платформе openSuse:

|src
|--Foolib
|----foolib.h
|----libfoo.so
|--Otherlib
|----otherlib.h
|----otherlib.hpp
|---+OtherlibSrcDirectory
|--bar.cpp
|--bar.h
|--Makefile

Структура каталогов на цели:

|program
|--libfoo.so
|--prog

Мой Makefile :

LIBS = -LFoolib -lfoo
INC = -I OtherLib -I Foolib
CXXFLAGS += -lpthread -std=c++11 -D_GLIBCXX_USE_NANOSLEEP $(INC)
LDFLAGS = '-Wl,-rpath,$$ORIGIN'
SRC_FILES = bar.cpp
OBJ =  $(SRC_FILES:%.cpp=%.o)

prog: $(OBJ)
    $(CXX) $(CXXFLAGS) $(LDFLAGS) $(LIBS) -o $@ $^

%.o: %.cpp
    $(CXX) $(CXXFLAGS) $(LIBS) -c $<

Обычно bar.h включает Foolib/foolib.h, а также Otherlib/OtherlibSrcDirectory и bar.cpp включает bar.h. Затем некоторые функции из foolib.h вызываются в bar.cpp и возвращают значения ошибок. Если необходимо, я могу подробнее рассказать о коде, но пока оставлю его, чтобы он был немного короче.

Любая помощь будет очень признательна!

1 Ответ

0 голосов
/ 16 июля 2020

Обнаружил мою ошибку.

libfoo.so уже был на целевой машине и находился в правильной папке (/ lib). Моя программа смогла найти его без проблем.

Моя ошибка: я выполнил свою программу на целевой машине без разрешений root. Без разрешений root мне не разрешено инициализировать Foolib.

sudo ./prog все исправлено.

...