在编译在Linux上使用POSIX aio库(例如aio_read(),aio_write()等)的示例程序时,我对链接器有困难。
我正在运行带有2.6内核的Ubuntu,并使用apt-get实用程序来安装libaio。但即使我正在链接aio库,编译器仍然会给我链接器错误。
root@ubuntu:/home# g++ -L /usr/lib/libaio.a aio.cc -oaio
/tmp/cc5OE58r.o: In function `main':
aio.cc:(.text+0x156): undefined reference to `aio_read'
aio.cc:(.text+0x17b): undefined reference to `aio_error'
aio.cc:(.text+0x191): undefined reference to `aio_return'
collect2: ld returned 1 exit status
如果不是在库libaio.a中,所有这些aio_x函数实际定义在哪里?
答案 0 :(得分:8)
编辑:根据手册页,libaio.so不是链接到的正确库:
man aio_read
概要
#include <aio.h> int aio_read(struct aiocb *aiocbp); Link with -lrt.
所以你应该链接这个:
g++ -lrt aio.cc -o aio
库使用gcc的方式是这样的:
-L将目录dir添加到要搜索-l的目录列表中。
-l自己添加一个库,如果文件名为libsomename.so,你只需使用“-lsomename”
答案 1 :(得分:7)
尽管正确安装了aio包并且存在libaio
标记,但我也遇到了与-lrt
链接的问题。
事实证明,在-l
命令调用中稍后放置gcc
标志(例如,最后一次)有时会解决此问题。我在Stack Overflow上偶然发现了这个解决方案here。
我停止这样做了:
gcc -Wall -Werror -g -o myExe -lrt myExe.c
并开始这样做:
gcc -Wall -Werror -g -o myExe myExe.c -lrt
答案 2 :(得分:0)
-L 是否指定了搜索路径,而 -l </ strong>是否指定了实际的库?
答案 3 :(得分:0)
尝试:
sudo apt-get install libaio-dev
然后确保在链接行指定-laio
。
答案 4 :(得分:0)
您需要-laio
才能链接到libaio。 -o
的参数是您希望调用已编译的可执行文件的参数。
答案 5 :(得分:0)
好的,Evan Teran是正确的 - 当我与-lrt链接时它起作用了。看来aio_x函数是在一般的POSIX扩展库中定义的。
谢谢,Evan。