Сборка приложения C на основе внешней библиотеки в Linux - PullRequest
1 голос
/ 03 апреля 2019

Я работаю над проектом Linux в C, состоящим из двух разных приложений с открытым исходным кодом. «Проект A» ( libduo ) создает архив, используемый для связывания нескольких тестовых программ, и создает библиотеку следующим образом:

/usr/bin/ar rv libduo.a duo.o http_parser.o https.o match.o parson.o urlenc.o
/usr/bin/ar: creating libduo.a
a - duo.o
a - http_parser.o
a - https.o
a - match.o
a - parson.o
a - urlenc.o
ranlib libduo.a

Одна из libduo тестовых программ построена следующим образом:

gcc -g -O2 -Wall -D_FORTIFY_SOURCE=2 -fstack-protector -I. -I.   -DDUODIR=\"/usr/local/duo/libduo/etc\" -DHAVE_CONFIG_H -c test-duologin.c
gcc -o test-duologin test-duologin.o -L.   -lduo -lssl -lcrypto 

«Проект B» - это модуль OpenLDAP , который я построил с помощью -lduo и несколько опций, чтобы указать ему, где искать вещи:

(cd .libs && rm -f pw-apr1.la && ln -s ../pw-apr1.la pw-apr1.la)
../../../libtool --mode=compile gcc -g -O2 -Wall  -I../../../include -I../../../include -I../../../servers/slapd -I../../../contrib/slapd-modules/passwd/libduo -c pw-duo.c
 gcc -g -O2 -Wall -I../../../include -I../../../include -I../../../servers/slapd -I../../../contrib/slapd-modules/passwd/libduo -c pw-duo.c  -fPIC -DPIC -o .libs/pw-duo.o
 gcc -g -O2 -Wall -I../../../include -I../../../include -I../../../servers/slapd -I../../../contrib/slapd-modules/passwd/libduo -c pw-duo.c -o pw-duo.o >/dev/null 2>&1
../../../libtool --mode=link gcc -g -O2 -Wall -version-info 0:0:0 \
-rpath /usr/local/libexec/openldap -module -o pw-duo.la pw-duo.lo libduo.a -lduo

*** Warning: Linking the shared library pw-duo.la against the
*** static library libduo.a is not portable!
cc -shared  .libs/pw-duo.o  libduo.a -lduo  -Wl,-soname -Wl,pw-duo.so.0 -o .libs/pw-duo.so.0.0.0
/usr/bin/ld: libduo.a(duo.o): relocation R_X86_64_32 against `.rodata.str1.1' can not be used when making a shared object; recompile with -fPIC
libduo.a: error adding symbols: Bad value
collect2: error: ld returned 1 exit status
Makefile:51: recipe for target 'pw-duo.la' failed
make: *** [pw-duo.la] Error 1

Используемый мной Makefile - тот же, который распространяется с проектом OpenLDAP. Я только что добавил раздел в Makefile для сборки моего модуля, используя те же опции для других модулей, которые уже там, но добавив -lduo в мой раздел вместе с путями к libduo include и libduo.a.

Как подсказывает make выше, я перекомпилировал, добавив -fPIC после опции -Wall, но эта ошибка повторялась. В крайнем случае, я попытался добавить -static к сборке модуля, но make тоже не имел ничего:

*** Warning: Linking the shared library pw-duo.la against the
*** static library libduo.a is not portable!

Это первый раз, когда я пытался создать приложение C для библиотеки, находящейся не в стандартных местах Linux, поэтому не совсем уверен, что происходит. Я подозреваю, что libduo предназначен для статической связи со всем, но модули OpenLDAP предназначены для использования общих библиотек. Кто-нибудь может объяснить?

Обновление: с помощью комментариев ниже и этой ссылки Я создал общую библиотеку из файлов .o и распространял / создавал против этого.

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