【发布时间】: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