Подтвердить что ты не робот

Как скомпилировать файл .c с OpenSSL?

Я пытаюсь скомпилировать небольшой файл .c, который имеет следующее:

#include <openssl/ssl.h>
#include <openssl/rsa.h>
#include <openssl/x509.h>
#include <openssl/evp.h>

В той же папке, где у меня есть файл .c, у меня есть /openssl со всеми этими файлами (и более), также в диспетчере синаптических пакетов я вижу, что OpenSSL установлен, я пытаюсь скомпилировать с этим:

gcc -o Opentest Opentest.c -lcrypto

но я всегда получаю ошибки:

error: openssl/ssl.h: No such file or directory
error: openssl/rsa.h: No such file or directory
error: openssl/x509.h: No such file or directory
error: openssl/evp.h: No such file or directory

Файл, который я хочу скомпилировать, - это только файл .c, не имеет Makefile или. /configure.

Я уже пробовал:

env CFLAGS=-I/path/to/openssl/

и попытался скомпилировать снова, но я получаю те же ошибки.

Что мне делать для компиляции с помощью openssl?

4b9b3361

Ответ 1

Ваши пути включения указывают, что вы должны компилироваться в соответствии с системной установкой OpenSSL. У вас не должно быть файлов .h каталоге с вашими пакетами - их нужно собирать из /usr/include/openssl.

libssl пакет OpenSSL (libssl) не включает в себя файлы .h - вам также необходимо установить пакет разработки. Это называется libssl-dev в Debian, Ubuntu и аналогичных дистрибутивах, а libssl-devel в CentOS, Fedora, Red Hat и аналогичных.

Ответ 2

Используйте флаг -I для gcc правильно.

gcc -I/path/to/openssl/ -o Opentest -lcrypto Opentest.c

-I должен указывать на каталог, содержащий папку openssl.

Ответ 3

Используйте фрагмент ниже как решение для процитированного вызова;

yum install openssl
yum install openssl-devel

Протестировано и доказано, что оно работает на CentOS версии 5.4 с сохраненной версией 1.2.7.

Ответ 4

Если заголовки OpenSSL находятся в подкаталоге openssl текущего каталога, используйте:

gcc -I. -o Opentest Opentest.c -lcrypto

Препроцессор пытается создать такое имя, как "./openssl/ssl.h", из "." в опции -I и имя, указанное в угловых скобках. Если вы указали имена в двойных кавычках (#include "openssl/ssl.h"), вам, возможно, никогда не понадобилось бы задавать вопрос; компилятор в Unix обычно ищет заголовки, заключенные в двойные кавычки в текущем каталоге автоматически, но это не делается для заголовков, заключенных в угловые скобки (#include <openssl/ssl.h>). Это определенное поведение реализации.

Вы не говорите, где находятся библиотеки OpenSSL - вам может потребоваться добавить подходящую опцию и аргумент, чтобы указать, например, "-L /opt/openssl/lib".

Ответ 5

Из файла openssl.pc

prefix=/usr
exec_prefix=${prefix}
libdir=${exec_prefix}/lib
includedir=${prefix}/include

Name: OpenSSL
Description: Secure Sockets Layer and cryptography libraries and tools
Version: 0.9.8g
Requires:
Libs: -L${libdir} -lssl -lcrypto
Libs.private: -ldl -Wl,-Bsymbolic-functions -lz
Cflags: -I${includedir}

Вы можете указать путь к каталогу Include и путь Libs. Теперь ваш префикс для файлов include /home/username/Programming. Следовательно, ваш файл include должен быть -I//home/username/Programming.

(Да, я получил это из комментариев выше)

Это просто для удаления журналов относительно заголовков. Вы также можете предоставить опцию -L<Lib path> для связи с библиотекой -lcrypto.

Ответ 6

Вам необходимо указать путь к библиотеке (-L/usr/local/lib/)

gcc -o Opentest Opentest.c -L/usr/local/lib / -Lssl -Lcrypto

Меня устраивает.

Ответ 7

Для этой ошибки gcc вам следует обратиться к gcc document о пути поиска.

Короче:

1) Если вы используете угловые скобки (< > ) С#include, gcc будет сначала искать файл заголовка из системного пути, например /usr/local/include и/usr/include, и т.д.

2) Путь, указанный параметром командной строки -Ldir, будет выполняться перед каталогами по умолчанию.

3) Если вы используете цитату ( ") С#include как #include" file", сначала будет искать каталог, содержащий текущий файл.

поэтому ответ на ваш вопрос следующий:

1) Если вы хотите использовать заголовочные файлы в папке исходного кода, замените < > на "" в директиве #include.

2), если вы хотите использовать параметр командной строки -I, добавьте его в свою компилируемую командную строку (если установить CFLAGS в переменных среды, он не будет ссылаться автоматически)

3) О конфигурации пакета (openssl.pc), я не думаю, что он будет ссылаться без явного объявления в конфигурации сборки.