Как скомпилировать файл .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?
Ответы
Ответ 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), я не думаю, что он будет ссылаться без явного объявления в конфигурации сборки.