未明确引用' _fdopen'当链接到bzip2库时

时间:2015-02-22 08:09:06

标签: c++ linux gcc g++ standard-library

我是在Linux上编译的新手,所以我在一些不熟悉的领域踩踏。 我在Ubuntu 14.04上使用G ++和GCC编译器。

我试图将bzip2(1.0.6)编译为共享库,并在另一个应用程序中使用它。

要构建共享库,我已经使用过:

gcc -shared -fPIC \
    -o ./lib/libbzip2.so \
blocksort.c bzip2.c bzlib.c compress.c crctable.c decompress.c huffman.c randtable.c \
    >& compile.log

未报告任何错误,并且已成功创建.so文件。

要构建我的应用程序并链接到bzip2库,我已经使用过:

g++ -std=c++11 \
    -I ../bzip2-106 \
    main.cpp \
    -L../bzip2-106/lib \
    -o main \
    -lbzip2 \
    >& compile.log

这会导致以下错误:

../bzip2-106/lib/libbzip2.so: undefined reference to `_fdopen'
../bzip2-106/lib/libbzip2.so: undefined reference to `_isatty'
../bzip2-106/lib/libbzip2.so: undefined reference to `_fileno'
collect2: error: ld returned 1 exit status

据我所知,fdopen,isatty和fileno是标准库中的函数。但如果是这样的话,那么编译器是否应该自动链接到相应的标准库?如果没有,我需要链接哪些库?下划线的重要性是什么?将bzip2编译为C库是否与它有关?

1 个答案:

答案 0 :(得分:1)

没有报告任何错误,因为您没有要求。符号上的前导下划线可能是直接问题。 bzip2带有一个Makefile-libbz2_so,它通常用作起点(它确实启用了编译器警告,并在共享对象中设置了依赖关系)。

Linux上的主要下划线是一个异常 - 很久以前(ELF之前),这些很常见。但标准化已经废除了这一点。无论我使用您引用的命令编译,还是使用推荐的makefile,共享库中的外部符号都没有前导下划线。相反," nm"没有选项显示(例如,使用Ubuntu 14.04)

U fchmod@@GLIBC_2.2.5                                          
U fchown@@GLIBC_2.2.5                                          
U fclose@@GLIBC_2.2.5                                          
U fdopen@@GLIBC_2.2.5                                          
U ferror@@GLIBC_2.2.5                                          
U fflush@@GLIBC_2.2.5                                          
U fgetc@@GLIBC_2.2.5   

至于与g ++的链接(main.cpp没有显示),我们假设它包含bzlib.h(它确实有预期的extern" C"包装C原型)。

所以...我们错过了一些信息。