Я работаю над проектом 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
и распространял / создавал против этого.