Проблемы с общей библиотекой GCC - PullRequest
2 голосов
/ 07 декабря 2011

Я пытаюсь создать разделяемую библиотеку в Ubuntu с помощью gcc
У меня есть только один простой класс (shared.h и shared.cpp) и один клиент для его использования (main.cpp)
Этомой make-файл, и я все еще не могу получить программу для компиляции.

all:
    #compile object(fPIC: creates position independent code)
    gcc -fPIC -Wall -g -c shared.cpp

    #compile shared library
    gcc -shared -Wl,-soname,libshared.so.1 -o libshared.so.1.0.1 shared.o -lc

    #link shared library
    gcc -g -o main main.cpp -L. -lshared
  • Я уверен, что первая строка верна
  • Я не уверен, что "-lc "делаетЯ думаю, что это передает что-то компоновщику?
  • Я не хочу устанавливать библиотеку, я просто хочу связать ее из текущего каталога.Я пытался: export LD_LIBRARY_PATH=.
    , но это, похоже, не имеет значения.Все в текущем каталоге.

    ОШИБКА: / usr / bin / ld: не удается найти -lshared

как мне получить компиляторпроверить текущий каталог для моей библиотеки?

Ответы [ 2 ]

4 голосов
/ 07 декабря 2011

Проблема не в том, что она не просматривается в каталоге, а в том, что вы назвали библиотеку "libshared.so.1.0.1". Когда вы используете -lshared, он ищет файл с именем «libshared.so» или «libshared.a» в пути поиска библиотеки.

В большинстве случаев при использовании системных библиотек с поддержкой версий вы будете указывать ссылку на последнюю из них как libshared.so, даже если вы установили libshared.so.1 или libshared.so.1.0. 0,1' .

В вашем случае, если вы продолжите покидать файл с именем 'libshared.so.1.0.1', вам нужно будет создать 2 символические ссылки:

  1. libshared.so - чтобы найти библиотеку с помощью ld
  2. libshared.so.1 - Поскольку вы объявляли имя SO как libshared.so.1 при его создании, вам необходимо предоставить эту ссылку, в противном случае исполняемый файл не сможет найти подходящую общую библиотеку во время выполнения.
0 голосов
/ 07 декабря 2011

Вы не пишете никаких зависимостей, что является целью Makefile -s.И вам, вероятно, нужно форсировать путь запуска Возможно, что-то вроде

 .PHONY: all clean
 CXX=g++
 CXXFLAGS=-g -Wall
 all: main
 main: main.o libshared.so
        $(LINK.cpp) -o $@ $< -Wl,-rpath,. -L. -lshared
 libshared.so: shared.pic.o
        $(LINK.cpp) -shared -o $^ $< 
 main.o: main.cc shared.hh 
 %.pic.o: %.cc
        $(CXX) $(CXXFLAGS) -fPIC -c -o $@ $<
 #
 clean:
        rm -f *.o *.so main *~
...