【问题标题】:Undefined reference to '_fdopen' when linking against bzip2 library链接到 bzip2 库时对“_fdopen”的未定义引用
【发布时间】:2015-04-23 17:12:46
【问题描述】:

我是在 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库有关系吗?

【问题讨论】:

  • 您可以尝试将-x c 添加到您对libbzip2.so 的编译器调用中。如果不是这样,则使用nm -g 转储符号,然后运行grep(如grep fdopen)并返回报告。
  • 添加 '-x c' 似乎没有任何效果。它确实在符号转储中找到了一些东西,但是:puu.sh/g7Bdr/f8fd76b023.jpg
  • U 未定义(未通过T 在文本部分定义和导出;在文本部分通过t 未定义和私有)。 man fdopen 3 建议您需要与-lc 链接。
  • 尝试使用 -lc 链接 bzip2 库和主应用程序,但仍然没有区别。
  • 你能做 ldd libbzip2.so 并发布输出吗?

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


【解决方案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(它确实具有包装 C 原型的预期 extern "C")。

所以...我们遗漏了一些信息。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-03
    相关资源
    最近更新 更多