Как скомпилировать.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?
7 ответов
Ваши пути включения указывают, что вы должны компилироваться в соответствии с системной установкой OpenSSL. Вы не должны иметь .h
файлы в каталоге вашего пакета - он должен забирать их из /usr/include/openssl
,
Простой пакет OpenSSL (libssl
) не включает .h
файлы - вам также нужно установить пакет разработки. Это называется libssl-dev
в Debian, Ubuntu и аналогичных дистрибутивах, и libssl-devel
на CentOS, Fedora, Red Hat и аналогичных.
Использовать -I
пометить gcc правильно.
gcc -I/path/to/openssl/ -o Opentest -lcrypto Opentest.c
-I
должен указывать на каталог, содержащий openssl
папка.
Мой английский не очень хорош, но я нашел патч для этой проблемы на китайской веб-странице
ням установить openssl ням установить openssl-devel
установить это и вот оно, протестировано в centos 5.4 и keepalived-1.2.7]
Вам необходимо указать путь к библиотеке (-L/usr/local/lib/)
gcc -o Opentest Opentest.c -L/usr/local/lib/ -lssl -lcrypto
Меня устраивает.
Если заголовки 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
".
Из файла 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}
Из этого вы можете отметить путь к каталогу "Включить" и путь к Libs. Теперь ваш префикс для включаемых файлов /home/username/Programming
, Следовательно, ваш параметр включения файла должен быть -I//home/username/Programming
,
(Да, я получил это из комментариев выше)
Это просто для удаления логов, касающихся заголовков. Вы можете также предоставить -L<Lib path>
вариант для связи с -lcrypto
библиотека.
Для этой ошибки GCC, вы должны обратиться к документу GCC о пути поиска.
Короче:
1) Если вы используете угловые скобки (<>) с #include, gcc сначала будет искать файл заголовка по системному пути, например /usr/local/include и /usr/include и т. Д.
2) Путь, указанный параметром командной строки -Ldir, будет найден перед каталогами по умолчанию.
3) Если вы используете кавычку ("") с #include в качестве #include "file", сначала будет найден каталог, содержащий текущий файл.
Итак, ответ на ваш вопрос следующий:
1) Если вы хотите использовать заголовочные файлы в папке с исходным кодом, замените <> на "" в директиве #include.
2) если вы хотите использовать опцию командной строки -I, добавьте ее в командную строку компиляции (если CFLAGS задан в переменных среды, он не будет ссылаться автоматически)
3) Что касается конфигурации пакета (openssl.pc), я не думаю, что на него будут ссылаться без явного объявления в конфигурации сборки.