Компиляция программы на C ++ с POSIX AIO lib в Linux - PullRequest
4 голосов
/ 02 августа 2009

У меня проблемы с компоновщиком, когда дело доходит до компиляции примера программы, использующей библиотеку POSIX aio (например, aio_read (), aio_write () и т. Д.) В Linux.

Я использую Ubuntu с ядром 2.6 и использую утилиту 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?

Ответы [ 6 ]

8 голосов
/ 02 августа 2009

РЕДАКТИРОВАТЬ: в соответствии со страницей руководства, 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"

7 голосов
/ 15 декабря 2014

У меня также были проблемы со связыванием с libaio, несмотря на то, что пакет aio был правильно установлен и присутствует флаг -lrt.

Оказалось, что размещение флагов -l позже (например, последний) в вызове команды gcc иногда решает эту проблему. Я наткнулся на это решение здесь в переполнении стека.

Я перестал это делать:

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

И начал делать это:

gcc -Wall -Werror -g -o myExe myExe.c -lrt
0 голосов
/ 02 августа 2009

Хорошо, Эван Теран прав - это сработало, когда я связался с -lrt. Кажется, функции aio_x определены в общей библиотеке расширений POSIX.

Спасибо, Эван.

0 голосов
/ 02 августа 2009

Вы хотите -laio для ссылки на libaio. Аргумент -o - это то, что вы хотите, чтобы вызывался скомпилированный исполняемый файл.

0 голосов
/ 02 августа 2009

Попробуйте:

sudo apt-get install libaio-dev

Затем убедитесь, что вы указали -laio в строке ссылки.

0 голосов
/ 02 августа 2009

Указывает ли -L путь поиска, а -l указывает фактическую библиотеку?

...