LINUX.ORG.RU

uuid_generate


0

0

Кто-нибудь может подсказать, где собака порылась? Ситуация следующая: Пытаюсь вызвать функцию uuid_generate, описанную в <uuid/uuid.h> и скомпиленную в библиотеке /lib/libuuid.so.1.2 (у меня RH 7.2 и все библиотеки, компилятор и т.п. - те, что шли с этим дистрибутивом - я ничего не менял). В опчем, компилится у меня все хорошо, а вот когда начинает линковаться (один из параметров линковки -luuid) даёт такую вот ошибку: undefined reference to 'uuid_generate(unsigned char *)' collect2: ld returned 1 exit status

Проверил данную либу на наличие в ей этой самой функции: objdump -t /lib/libuuid.so.1.2 | grep uuid_generate ответило 000015dc g F .text 00000043 uuid_generate Т.е. функция присутствует в библиотеке. Люди, подскажите, пожалуйста, что это может быть? А то я себе уже всю голову поломал.

anonymous

Попробуй:

$ldd твой_бинарик

Должен выдать список либ, от которых зависит твой_бинарик. Если одна
из зависимостей не будет найдена - все напишут на экране. Думаю что
у тебя что-то с кэшем для ld.so. Более подробно - man ld, man ldd,
man ld.so.

PETER ★★
()

военный! -luuid будет искать сначала в путях линковки libuuid.a(в некоторых случаях потом libuuid.so)
нужен этот флаг для того чтобы не писать lib и .a и не знать путь.
поэтому линкуй так:
gcc -c prog.c
gcc -o prog prog.o /lib/libuuid.so.1.2

lg ★★
()

Всем спасибо, но:
$ldd мой_бинарник сделать не могу, т.к. бинарник не генерится в результате ошибки линковки.
Делая
gcc -c prog.c
gcc -o prog prog.o /lib/libuuid.so.1.2
или
gcc -c prog.c
gcc -o prog prog.o /usr/lib/libuuid.a
дает ту же самую ошибку линковки, что и при нормальной компиляции с параметром -luuid.

Сделал я ld /lib/libuuid.1.2, и возвернуло ошибку cannot find entry symbol _start; not setting start address - похоже именно поэтому не линкуется. Попробую переустановить библиотеки.

Всем большое спасибо.

anonymous
()

Да чойто я сбойнул ;)

PETER ★★
()

А вот, собственно и решение проблемы.
Как известно, когда исходники - файлы *.cpp, gcc вызывает g++ для компилирования кода. В общем, в моем случае, это были именно cpp. В файле же <uuid/uuid.h>, в том месте, где декларируются функции, нет директивы
#ifdef __cplusplus
extern "C" {
#endif
...
#ifdef __cplusplus
}
#endif
Как по мне, так это очень грубая ошибка.
Таким образом, компилятор С++ генерирует вызов функции uuid_generate как вызов любой функции С++, а не С. А линковщик, естессна, не находит ее, т.к. она скомпилирована в libuuid.a(.so) как функция С.
Выход:
#ifdef __cplusplus
extern "C" {
#endif

#include <uuid/uuid.h>

#ifdef __cplusplus
}
#endif

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.