在Linux上使用POSIX AIO lib编译C ++程序

时间:2009-08-01 22:57:08

标签: linux file posix aio

在编译在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函数实际定义在哪里?

6 个答案:

答案 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。