链接到静态库以构建静态可执行文件

时间:2013-06-26 20:26:04

标签: postgresql gcc compiler-construction static-libraries static-linking

我正在尝试构建一个C程序的静态可执行文件,它需要Postgresql libecpg-dev软件包中的以下库:libecpg,libpq和libpgtypes。静态库libecpg.a,libpq.a,libpgtypes.a都位于与动态版本/ usr / lib相同的位置。我试过添加-L选项作为他们的路径,但我得到了相同的结果。

我的可执行文件需要是静态的,以便二进制文件可以移植,这样用户就不必将库安装到他们的系统上就可以使用它。当我对动态库使用以下命令时,程序构建正常:(对于我正在使用的一些Postgresql函数,必须包含-I目录)

 gcc main.o -lecpg -lpq -lpgtypes -I/usr/include/postgresql -o program_name

当我尝试链接到静态库时,我使用以下命令:

gcc -static main.o -lecpg -lpq -lpgtypes -I/usr/include/postgresql -o program_name 

然而,编译器给出了一长串“未定义引用”错误作为输出。有这么多,但这里有一个小样本:

/usr/lib/gcc/x86_64-linux-gnu/4.6/../../../../lib/libecpg.a(descriptor.o):
In function `get_descriptors':
(.text+0xc3): undefined reference to `pthread_once'
 /usr/lib/gcc/x86_64-linux-gnu/4.6/../../../../lib/libecpg.a(descriptor.o): In function `ECPGdeallocate_desc':
(.text+0x2c6): undefined reference to `pthread_setspecific'
/usr/lib/gcc/x86_64-linux-gnu/4.6/../../../../lib/libecpg.a(descriptor.o): In function `ECPGallocate_desc':
(.text+0x376): undefined reference to `pthread_setspecific'
/usr/lib/gcc/x86_64-linux-gnu/4.6/../../../../lib/libecpg.a(descriptor.o): In function `get_descriptors':
(.text+0xd2): undefined reference to `pthread_getspecific'

当我按如下方式更改订单时:

gcc -I/usr/include/postgresql -static -lecpg -lpq -lpgtypes -o program_name main.o

编译器输出看起来如下(再次,只是一个小样本):

main.c:(.text+0x5c6): undefined reference to `ECPGconnect'
main.c:(.text+0x83e): undefined reference to `ECPGdo'
main.c:(.text+0x843): undefined reference to `ECPGget_sqlca'
main.c:(.text+0x85c): undefined reference to `ECPGdisconnect'
main.c:(.text+0x87c): undefined reference to `ECPGget_sqlca'

我尝试过使用-I选项(以及所有其他选项),但似乎没有任何效果。

2 个答案:

答案 0 :(得分:1)

我认为你不能再在现代Linux发行版中创建一个完全静态的非平凡可执行文件了。但是you can statically include some specific libraries

答案 1 :(得分:0)

尝试这样:

 gcc main.o /usr/include/postgresql/libecpg.a /usr/include/postgresql/libecpg.a /usr/include/postgresql/libpq.a /usr/include/postgresql/libpgtypes.a -o program_name