LINUX.ORG.RU

undefined reference. ld returned 1 exit status

 ,


0

2

Не могу собрать казалось бы элементарную программу:

// hello.cpp

#include <stdio.h>
#include "crypt_blowfish-1.2/ow-crypt.h"

int main()
{
    //puts("H3LLO!");
    crypt(0, 0); // нули, просто для примера
    return 0;
}
$ g++ hello.cpp -L crypt_blowfish-1.2 -lcrypt_blowfish -o hello
/tmp/ccct9dc3.o: In function `main':
hello.cpp:(.text+0xf): undefined reference to `crypt(char const*, char const*)'
collect2: error: ld returned 1 exit status
crypt_blowfish собиралась так:
$ wget http://www.openwall.com/crypt/crypt_blowfish-1.2.tar.gz
$ tar -xvf crypt_blowfish-1.2.tar.gz
$ cd crypt_blowfish-1.2
$ make

gcc -c -W -Wall -Wbad-function-cast -Wcast-align -Wcast-qual -Wmissing-prototypes -Wstrict-prototypes -Wshadow -Wundef -Wpointer-arith -O2 -fomit-frame-pointer -funroll-loops crypt_blowfish.c
gcc -c x86.S
gcc -c -W -Wall -Wbad-function-cast -Wcast-align -Wcast-qual -Wmissing-prototypes -Wstrict-prototypes -Wshadow -Wundef -Wpointer-arith -O2 -fomit-frame-pointer -funroll-loops crypt_gensalt.c
gcc -c -W -Wall -Wbad-function-cast -Wcast-align -Wcast-qual -Wmissing-prototypes -Wstrict-prototypes -Wshadow -Wundef -Wpointer-arith -O2 -fomit-frame-pointer -funroll-loops wrapper.c
echo '.so man3/crypt.3' > crypt_r.3
echo '.so man3/crypt.3' > crypt_rn.3
echo '.so man3/crypt.3' > crypt_ra.3
echo '.so man3/crypt.3' > crypt_gensalt.3
echo '.so man3/crypt.3' > crypt_gensalt_rn.3
echo '.so man3/crypt.3' > crypt_gensalt_ra.3
$ ar rsv libcrypt_blowfish.a *.o

ar: creating libcrypt_blowfish.a
a - crypt_blowfish.o
a - crypt_gensalt.o
a - wrapper.o
a - x86.o
Вроде все собралось без ошибок, не пойму, почему в итоге получаю undefined reference? ЧЯДНТ?

$ g++ hello.cpp -L crypt_blowfish-1.2 -lcrypt_blowfish -o hello

После -L у тебя идет пробел. Если это путь к библиотеке, то пробела быть не должно

grondek
()

-L crypt_blowfish-1.2

у тебя библиотека лежит в каталоге crypt_blowfish-1.2 ?

подозреваю нужен -L .

Elyas ★★★★★
()
Ответ на: комментарий от Elyas

Да, лежит в каталоге crypt_blowfish-1.2, -L установлен $g++ hello.cpp -Lcrypt_blowfish-1.2 -lcrypt_blowfish -o hello.

neversleep ★★
() автор топика
Ответ на: комментарий от neversleep

crypt_blowfish-1.2 - это каталог к библиотеке относительно какого пути? Можешь попробовать для пробы указать полный путь.

grondek
()
Ответ на: комментарий от grondek

Не помогает(полный путь подсовывал, с корня). Вообще оно бы ругалось, если бы не могло найти библиотеку.

joy4eg

-lutil -lcrypt

g++ hello.cpp -Lcrypt_blowfish-1.2 -lcrypt_blowfish -lutil -lcrypt -o hello

Тоже не помогло(

neversleep ★★
() автор топика
Ответ на: комментарий от joy4eg
$ gcc -Wall hello.c -L$PWD/crypt_blowfish-1.2 -lcrypt_blowfish -o t
$ echo $?
0
$ g++ -Wall hello.c -L$PWD/crypt_blowfish-1.2 -lcrypt_blowfish -o t
/tmp/ccWfElWs.o: In function `main':
hello.c:(.text+0xf): undefined reference to `crypt(char const*, char const*)'
collect2: ld returned 1 exit status
joy4eg ★★★★★
()
Ответ на: комментарий от joy4eg

Возможно дело в том, что функция crypt не описана в заголовке как extern «C». В результате g++ применяет к ней c++ name mangling и не находит.

ddos3
()
$ cat ./test.c
#include <unistd.h>

int main()
{
    crypt(0, 0);
    return 0;
}
$ gcc -lcrypt ./test.c
$ ls
a.out  test.c

чем системная библиотека не угодила?

anonymous
()
Ответ на: комментарий от Moncruist

Плюсую. У него походу статическая библиотека, а к ней нужно полный путь указывать.

anonymous
()

Всем спасибо, в частности joy4eg, за эту подсказку.
Дело было не в бобине путях, просто пересобрал библиотеку под плюсы, заработало(пока). Теперь интересно, насколько это правильно, или, все таки быдло-way?

neversleep ★★
() автор топика
Ответ на: комментарий от neversleep

просто пересобрал библиотеку под плюсы

Но зачем ? ведь либа то сишная. Или тебе нужны именно плюсы ?

joy4eg ★★★★★
()
Ответ на: комментарий от joy4eg

И кстати, а зачем тебе это все ? оно ведь для хеширования паролей ... (т.е. работает только в одну сторону, decrypt() там нету)

joy4eg ★★★★★
()
Ответ на: комментарий от joy4eg

Или тебе нужны именно плюсы ?

This.

оно ведь для хеширования паролей

And this.

neversleep ★★
() автор топика
Ответ на: комментарий от neversleep

Скомпилируй либу с использованием и gcc, и g++, и посмотри экспортируемые символы через objdump --syms, поймешь, в чем дело. Также прочитай про extern «C».

kravich ★★★★
()
Последнее исправление: kravich (всего исправлений: 1)
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.