2013-11-14 2 views
0

У меня есть следующие MakefileLinked библиотеки не найдена во время выполнения (C++)

FLAGS = -g -c -Wall -Wextra -O2 -pedantic -Werror 
CC = g++ 
SOURCE = $(wildcard src/*.cpp) 
INTERM = $(patsubst %.cpp,%.o,$(SOURCE)) 
OBJECTS = $(patsubst src/%,nbobj/%,$(INTERM)) 
RES = app 
INCLUDE = -I../../libs 
OPENCV = -L/usr/local/lib `pkg-config --cflags --libs opencv` 
LINK = -L./../../libs -lgstd $(OPENCV) 


$(RES): $(OBJECTS) 
    $(CC) $(OBJECTS) -o $(RES) $(LINK) 

nbobj/%.o: src/%.cpp 
    $(CC) $(FLAGS) $(INCLUDE) -o [email protected] -c $< 

clean: 
    rm -rf $(RES) $(OBJECTS) 

Он отлично компилируется, но при запуске программы я получаю

ошибки при загрузке разделяемых библиотек: libgstd. так: не могу открыть файл разделяет объект: нет такого файла или каталога

в этой связи возникает несколько вопросов для меня:

  • libgstd был явно найден во время компиляции (если я удаляю -lgstd, программа не компилируется), а .so не двигался, когда я запускал программу. Как это внезапно больше не найдено?
  • Я прочитал много сообщений, которые говорят, что мне нужно изменить ld.conf. Я думал, что точка флага -L должна была точно избегать этого. Я действительно не хочу изменять системный файл для небольшой библиотеки, которую я написал. Также я хочу отправить исполняемый файл и libgstd вместе в одной папке, не заставляя кого-либо «устанавливать» libgstd, возиться с системными файлами.
  • Я также прочитал, что флаг -R является эквивалентом -L для времени выполнения, но если я компилирую с -R, компилятор говорит «ошибка: неопознанный параметр„-R“»

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

Большое вам спасибо за вашу помощь :)

+0

Благодарим вас за ответ. Что делает флаг -L, если он не указывает компоновщику на поиск в каталоге и почему существует разница между компиляцией и временем выполнения с точки зрения поиска библиотеки? – megavore

ответ

1

во время запуска программы, операционная система не может найти Lib для загрузки, особенно это даже не знаю, где искать,

с тех пор. /../../libs - это не путь поиска. Вы можете сделать 2 things.first, переместите LIB в папку она будет искать (в зависимости от системы)

/lib/ or /lib64/ or /usr/lib ...

или второй показать вашу операционную систему, где искать

export LD_LIBRARY_PATH=/absolut/path/to/libs

-L указывает, дополнительные пути, где искать время ссылки на компоновщик нет во время выполнения для os. -l указывает дополнительные библиотеки во время компиляции.

Смежные вопросы