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

在编译使用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 

所有这些aio_x函数实际上定义在哪里,如果不在库libaio.a中?

编辑:根据手册页,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”

尽管aio软件包已正确安装并且存在-lrt标志,但我也遇到了与libaio链接的问题。

事实证明,在gcc命令调用中稍后(例如,最后一个)放置-l标志有时可以解决这个问题。 我在Stack Overflow上偶然发现了这个解决方案。

我停止了这样做:

 gcc -Wall -Werror -g -o myExe -lrt myExe.c 

并开始这样做:

 gcc -Wall -Werror -g -o myExe myExe.c -lrt 

-L是否指定搜索路径, -l是否指定实际的库?

你想要连接到libaio。 -o的参数是你想要编译的可执行文件被调用的。

尝试:

 sudo apt-get install libaio-dev 

然后确保在链接行上指定-laio

好的,Evan Teran是正确的 – 当我与-lrt连接时,它是有效的。 看来aio_x函数是在通用的POSIX扩展库中定义的。

谢谢,埃文。