针对Linux上的外部库构建C应用程序

时间:2019-04-03 12:54:10

标签: c linux

我正在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文件创建了一个共享库,并根据该文件进行了分发/构建。

0 个答案:

没有答案