在编译使用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扩展库中定义的。
谢谢,埃文。