我正在C
中从事一个Linux项目,该项目由两个不同的开源应用程序组成。 “项目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和{{ 1}}。
正如上面的libduo.a
所建议的那样,我通过在make
选项之后添加-fPIC
进行了重新编译,但是重复了相同的错误。作为最后的选择,我尝试将-Wall
添加到模块版本中,但是-static
都没有:
make
这是我第一次尝试针对不在标准Linux位置的lib构建*** Warning: Linking the shared library pw-duo.la against the
*** static library libduo.a is not portable!
应用程序,因此无法完全确定发生了什么。我怀疑C
旨在静态链接到所有内容,但是OpenLDAP模块旨在使用共享库。任何人都可以阐明吗?
更新:借助下面的注释以及这个link,我从libduo
文件创建了一个共享库,并根据该文件进行了分发/构建。