Вопрос по openssl, gcc, linux, c – Не удается найти ошибку библиотеки libcrypto

22

Когда я пытаюсь скомпилироватьC код, который использует openssl "crypto" библиотечные функции с командной строкой-lcrypto сgcc 4.4.3 это дает ошибку

<code>`@ubu:$ gcc -ggdb aes_m.c -Werror -Wall -I /usr/local/ssl/include/ -lcrypto -o aes
 /usr/bin/ld: cannot find -lcrypto
 collect2: ld returned 1 exit status`
</code>

в чем может быть причина этого ??

Я уже прошел это обсуждениеЯ не могу найти существующую библиотеку но это не помогает.

результаты команды locate в

<code>$ locate libcrypto
/home/abhi/Downloads/openssl-1.0.1b/libcrypto.a
/home/abhi/Downloads/openssl-1.0.1b/libcrypto.pc
/lib/libcrypto.so.0.9.8
/lib/i486/libcrypto.so.0.9.8
/lib/i586/libcrypto.so.0.9.8
/lib/i686/cmov/libcrypto.so.0.9.8
/usr/lib/libcrypto.so.0.9.8
/usr/lib/vmware-tools/lib32/libcrypto.so.0.9.8
/usr/lib/vmware-tools/lib32/libcrypto.so.0.9.8/libcrypto.so.0.9.8
/usr/lib/vmware-tools/lib64/libcrypto.so.0.9.8
/usr/lib/vmware-tools/lib64/libcrypto.so.0.9.8/libcrypto.so.0.9.8
/usr/local/ssl/lib/libcrypto.a
/usr/local/ssl/lib/pkgconfig/libcrypto.pc
</code>

Может ли кто-нибудь помочь с этим или указать на любую ошибку, которую я делаю

@ Daniel Roethlisberger попытался использовать флаг -L, но это привело к этим ошибкам

<code>gcc -ggdb aes_m.c -Werror -Wall -I /usr/local/ssl/include/ -L /usr/local/ssl/lib -lcrypto -o aes
/usr/local/ssl/lib/libcrypto.a(dso_dlfcn.o): In function `dlfcn_globallookup':
dso_dlfcn.c:(.text+0x2d): undefined reference to `dlopen'
dso_dlfcn.c:(.text+0x43): undefined reference to `dlsym'
dso_dlfcn.c:(.text+0x4d): undefined reference to `dlclose'
/usr/local/ssl/lib/libcrypto.a(dso_dlfcn.o): In function `dlfcn_pathbyaddr':
dso_dlfcn.c:(.text+0x8f): undefined reference to `dladdr'
dso_dlfcn.c:(.text+0xe9): undefined reference to `dlerror'
/usr/local/ssl/lib/libcrypto.a(dso_dlfcn.o): In function `dlfcn_bind_func':
dso_dlfcn.c:(.text+0x4b1): undefined reference to `dlsym'
dso_dlfcn.c:(.text+0x590): undefined reference to `dlerror'
/usr/local/ssl/lib/libcrypto.a(dso_dlfcn.o): In function `dlfcn_bind_var':
dso_dlfcn.c:(.text+0x611): undefined reference to `dlsym'
dso_dlfcn.c:(.text+0x6f0): undefined reference to `dlerror'
/usr/local/ssl/lib/libcrypto.a(dso_dlfcn.o): In function `dlfcn_unload':
dso_dlfcn.c:(.text+0x755): undefined reference to `dlclose'
/usr/local/ssl/lib/libcrypto.a(dso_dlfcn.o): In function `dlfcn_load':
dso_dlfcn.c:(.text+0x837): undefined reference to `dlopen'
dso_dlfcn.c:(.text+0x8ae): undefined reference to `dlclose'
dso_dlfcn.c:(.text+0x8f5): undefined reference to `dlerror'
collect2: ld returned 1 exit status
</code>

Большое спасибо

Я бы предложил/usr/lib/ jedwards
Я думаю, что вам нужна символическая ссылка без номера версии. Эта статья может помочь jedwards
Конечно, вы должны ссылаться на (в gcc) ту же версию, против которой вы строите. Если вы не используете версию, отличную от 0.9.8, символическая ссылка/usr/lib/libcrypto.so в/usr/lib/libcrypto.so.0.9.8 будет хорошо работать jedwards
Тебе нужно добавить-ldl при выполнении последней ссылки. jww
@ jedwards хорошо, но где на самом деле я должен создать эту символическую ссылку .. я имею в виду папку, так как эта библиотека появляется во многих местах (см. выше, оставляя vmware * и в папке Download) спасибо abhi

Ваш Ответ

2   ответа
33

-L /usr/local/ssl/lib/ в командной строке GCC, перед-lcrypto. Так как вы строите против заголовков OpenSSL под/usr/local/ssl, вам также нужно связать действительную библиотеку с тем же префиксом (даже если у вас установлена только статическая библиотека, это может или не может быть вашим намерением; вам может потребоваться правильно переустановить OpenSSL, созданный из исходного кода) .

(редактировать) Чтобы исправитьdlopen() и друзья не найдены компоновщиком, добавьте-ldl в командной строке GCC.-ldl сообщает компоновщику также ссылку на libdl.so, которая является общей библиотекой, содержащейdlopen(), dlsym(), dlclose() так далее.; эти функции используются внутри OpenSSL и, таким образом,-ldl является косвенной зависимостью при использовании-lcrypto (в Linux). Поскольку вы ссылаетесь на статическую версию libcrypto, вам необходимо явно ссылаться на все косвенные зависимости.

Если вы не знакомы со ссылками на нужные библиотеки, я бы посоветовал вам использовать OpenSSL, установленный из диспетчера пакетов вашей операционной системы; это может избавить вас от неприятностей.

см. мои правки в исходном посте с вопросом об ошибках, которые я получил после использования флага -L .. я что-то не так делаю .. спасибо за ответ abhi
Добавлять-ldl в командную строку. Daniel Roethlisberger
-ldl решил проблему с -L / path / flag .. Можете ли вы объяснить, что на самом деле делает -ldl. Большое спасибо за ответ на один из моих вопросов .. abhi
@ abhi -ldl указывает компоновщику связать библиотеку dl с вашим выводом. В этом конкретном случае он говорит компоновщику добавить его «по имени», а не «по пути», поскольку параметр командной строки -L делает Alexey Vesnin
9

которые пытались собрать свой собственный openssl из исходного кода, а затем использовать его для компиляции других программ (в моем случае Git)

Во время настройки openssl добавьте параметр «общий доступ», например:./config shared

Это создаст необходимую статическую библиотеку libcrypto.so Вы найдете больше в файле INSTALL;)

Кроме того, если вы столкнулись с этой ошибкой во время 'make' ".... нельзя использовать при создании общего объекта; перекомпилируйте с -fPIC"

Просто добавьте -fPIC в ./config, например.

./config shared -fPIC

Хотя мне бы хотелось, чтобы кто-то сказал мне, что он на самом деле делает и что я ничего не напортачи

Это решение работает для тех, кто пытается скомпилировать нативную библиотеку tomcat (этот комментарий предназначен в основном для поисковой системы) Gustavo Arias Méndez
Comment для других сумасшедших, которые должны были скомпилировать git-пререквизиты, такие как libiconv, из нестандартного места. В этом случае вам нужно изменить CFLAGS и LDFLAGS в git Makefile. Добавьте '-liconv -lcurl' к CFLAGS и LDFLAGS = -L_your_path_to_lib Daniel Hollas

Похожие вопросы