当前位置: 技术问答>linux和unix
Linux下使用静态库的问题
来源: 互联网 发布时间:2016-07-08
本文导语: 本意:[/color] 之前在Linux下写了一些代码 现在要把这些代码打包成一个静态库 然后在另外的程序里使用这个静态库 打包后的静态库为: libTest.a 然后写了一段程序来测试这个包是否可用: /* main.c */ int main() { hw_mai...
本意:[/color]
之前在Linux下写了一些代码
现在要把这些代码打包成一个静态库
然后在另外的程序里使用这个静态库
打包后的静态库为: libTest.a
然后写了一段程序来测试这个包是否可用:
执行如下编译命令时:
gcc -o main main.c libfan.a
输出以下错误[color=#FF0000](大多是“multiple definition of”的错误 ):
collect2: ld terminated with signal 11 [Segmentation fault]
libfan.a(swapp)(.text+0x95994): In function `main':
: multiple definition of `main'
/tmp/ccAUcrMf.o(.text+0x0): first defined here
/usr/bin/ld: Warning: size of symbol `main' changed from 51 in /tmp/ccAUcrMf.o to 1208 in libfan.a(swapp)
libfan.a(swapp)(.fini+0x0): In function `_fini':
: multiple definition of `_fini'
/usr/lib/crti.o(.fini+0x0):/usr/src/packages/BUILD/glibc-2.3/cc/csu/crti.S:12: first defined here
libfan.a(swapp)(.init+0x0): In function `_init':
: multiple definition of `_init'
/usr/lib/crti.o(.init+0x0): first defined here
/usr/bin/ld: BFD 2.15.90.0.1.1 20040303 (SuSE Linux) assertion fail ../../bfd/elf.c:1381
/usr/bin/ld: BFD 2.15.90.0.1.1 20040303 (SuSE Linux) assertion fail ../../bfd/elf.c:1390
/usr/bin/ld: BFD 2.15.90.0.1.1 20040303 (SuSE Linux) assertion fail ../../bfd/elf.c:1381
/usr/bin/ld: BFD 2.15.90.0.1.1 20040303 (SuSE Linux) assertion fail ../../bfd/elf.c:1390
libfan.a(swapp)(.data+0x0): In function `_fdata':
: multiple definition of `__data_start'
/usr/lib/crt1.o(.data+0x0):../sysdeps/i386/elf/start.S:47: first defined here
libfan.a(swapp)(*ABS*+0xc1cec0): multiple definition of `_GLOBAL_OFFSET_TABLE_'
/usr/lib/crt1.o(.got.plt+0x0):../sysdeps/i386/elf/start.S:47: first defined here
/usr/bin/ld: warning: unknown architecture of input file `libfan.a(swapp)' is incompatible with i386 output
另外,也在csdn上看了一些帖子,试了如下的command:
gcc -L . -lfan -Wstrict-prototypes -Wall -Wunused -O3
等等,都没有用
请高手赐教
另外,也烦请哪位大虾能指点下如何使用静态库的完整资料
因为公司只开放部分网站的访问,请不要贴连接,麻烦直接将内容贴到楼下 多谢拉
之前在Linux下写了一些代码
现在要把这些代码打包成一个静态库
然后在另外的程序里使用这个静态库
打包后的静态库为: libTest.a
然后写了一段程序来测试这个包是否可用:
/*
main.c
*/
int main()
{
hw_main(1, 0);//hw_main()为库里的函数
return 0;
}
执行如下编译命令时:
gcc -o main main.c libfan.a
输出以下错误[color=#FF0000](大多是“multiple definition of”的错误 ):
collect2: ld terminated with signal 11 [Segmentation fault]
libfan.a(swapp)(.text+0x95994): In function `main':
: multiple definition of `main'
/tmp/ccAUcrMf.o(.text+0x0): first defined here
/usr/bin/ld: Warning: size of symbol `main' changed from 51 in /tmp/ccAUcrMf.o to 1208 in libfan.a(swapp)
libfan.a(swapp)(.fini+0x0): In function `_fini':
: multiple definition of `_fini'
/usr/lib/crti.o(.fini+0x0):/usr/src/packages/BUILD/glibc-2.3/cc/csu/crti.S:12: first defined here
libfan.a(swapp)(.init+0x0): In function `_init':
: multiple definition of `_init'
/usr/lib/crti.o(.init+0x0): first defined here
/usr/bin/ld: BFD 2.15.90.0.1.1 20040303 (SuSE Linux) assertion fail ../../bfd/elf.c:1381
/usr/bin/ld: BFD 2.15.90.0.1.1 20040303 (SuSE Linux) assertion fail ../../bfd/elf.c:1390
/usr/bin/ld: BFD 2.15.90.0.1.1 20040303 (SuSE Linux) assertion fail ../../bfd/elf.c:1381
/usr/bin/ld: BFD 2.15.90.0.1.1 20040303 (SuSE Linux) assertion fail ../../bfd/elf.c:1390
libfan.a(swapp)(.data+0x0): In function `_fdata':
: multiple definition of `__data_start'
/usr/lib/crt1.o(.data+0x0):../sysdeps/i386/elf/start.S:47: first defined here
libfan.a(swapp)(*ABS*+0xc1cec0): multiple definition of `_GLOBAL_OFFSET_TABLE_'
/usr/lib/crt1.o(.got.plt+0x0):../sysdeps/i386/elf/start.S:47: first defined here
/usr/bin/ld: warning: unknown architecture of input file `libfan.a(swapp)' is incompatible with i386 output
另外,也在csdn上看了一些帖子,试了如下的command:
gcc -L . -lfan -Wstrict-prototypes -Wall -Wunused -O3
等等,都没有用
请高手赐教
另外,也烦请哪位大虾能指点下如何使用静态库的完整资料
因为公司只开放部分网站的访问,请不要贴连接,麻烦直接将内容贴到楼下 多谢拉
|
很明显,楼主编译成libTest.a 里的.o的时候没有用-c参数嘛。
显然楼主的libTest.a里有个文件swapp,编译这个文件的时候没有用-c参数(实际上swapp是一个可执行文件,而不是.o,楼主可以用file swapp检查),而且里面还有一个main函数。
楼主的应该先学一下基本的关于静态库的使用。
1. 静态库应该包含的.o文件,通常用gcc -c foo.c生成。
2. 用ar cr libfoo.a foo.o
3. gcc -c main.c
4. gcc -o fooprog main.o -L. -lfoo
或者
gcc -o fooprog main.o libfoo.a
显然楼主的libTest.a里有个文件swapp,编译这个文件的时候没有用-c参数(实际上swapp是一个可执行文件,而不是.o,楼主可以用file swapp检查),而且里面还有一个main函数。
楼主的应该先学一下基本的关于静态库的使用。
1. 静态库应该包含的.o文件,通常用gcc -c foo.c生成。
2. 用ar cr libfoo.a foo.o
3. gcc -c main.c
4. gcc -o fooprog main.o -L. -lfoo
或者
gcc -o fooprog main.o libfoo.a
mymtom@freebsd$ cc -o txdemo2.o txdemo2.c
mymtom@freebsd$ ar cr libdemo.a txdemo2.o
mymtom@freebsd$ cc -o txdemo txdemo.c libdemo.a
libdemo.a(txdemo2.o)(.data+0x4): multiple definition of `__dso_handle'
/usr/lib/crtbegin.o(.data+0x0): first defined here
libdemo.a(txdemo2.o)(.init+0x0): In function `_init':
: multiple definition of `_init'
/usr/lib/crti.o(.init+0x0): first defined here
libdemo.a(txdemo2.o)(.data+0x0): multiple definition of `__progname'
/usr/lib/crt1.o(.data+0x0): first defined here
libdemo.a(txdemo2.o)(.text+0x0): In function `_start':
: multiple definition of `_start'
/usr/lib/crt1.o(.text+0x0): first defined here
libdemo.a(txdemo2.o)(.data+0x20): multiple definition of `tx'
/var/tmp//cc5i308n.o(.data+0x0): first defined here
libdemo.a(txdemo2.o)(.text+0x100): In function `main':
: multiple definition of `main'
/var/tmp//cc5i308n.o(.text+0x0): first defined here
/usr/bin/ld: Warning: size of symbol `main' changed from 361 in /var/tmp//cc5i308n.o to 373 in libdemo.a(txdemo2.o)
libdemo.a(txdemo2.o)(.fini+0x0): In function `_fini':
: multiple definition of `_fini'
/usr/lib/crti.o(.fini+0x0): first defined here
/usr/lib/crt1.o(.dynamic+0x0): multiple definition of `_DYNAMIC'
libdemo.a(txdemo2.o)(.dynamic+0x0): first defined here
/usr/lib/crt1.o(.got.plt+0x0): multiple definition of `_GLOBAL_OFFSET_TABLE_'
libdemo.a(txdemo2.o)(.got+0x0): first defined here
|
是不是你的库里面有main函数啊?
|
很显然是libFan.a文件有问题, 这个静态库不正确.
可以参照automake工具用libtool去打包
可以参照automake工具用libtool去打包