Как скомпилировать .c файл с OpenSSL включает? - PullRequest
66 голосов
/ 30 июля 2010

Я пытаюсь скомпилировать небольшой файл .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 ]

99 голосов
/ 30 июля 2010

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

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

9 голосов
/ 30 июля 2010

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

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

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

6 голосов
/ 24 апреля 2013

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

yum install openssl
yum install openssl-devel

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

4 голосов
/ 01 февраля 2018

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

gcc -o Opentest Opentest.c -L/usr/local/lib/ -lssl -lcrypto

Это работает для меня.

4 голосов
/ 30 июля 2010

Из файла 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.

4 голосов
/ 30 июля 2010

Если заголовки 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'.

1 голос
/ 17 февраля 2016

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

Короче:

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

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

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

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

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

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

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

...