如何使用OpenSSL编译.c文件?
我正在尝试编译一个小的.c文件,它包含以下内容:
#include <openssl/ssl.h> #include <openssl/rsa.h> #include <openssl/x509.h> #include <openssl/evp.h>
在相同的文件夹中,我有.c文件我有一个/ openssl与所有这些文件(和更多),也在突触包pipe理器我看到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进行编译?
包含path表示您应该针对系统的 OpenSSL安装进行编译。 您的软件包目录中不应该有.h
文件 – 应该从/usr/include/openssl
select它们。
普通的OpenSSL包( libssl
)不包含.h
文件 – 您还需要安装开发包( libssl-dev
)。
使用-I
标志正确地gcc。
gcc -I/path/to/openssl/ -o Opentest -lcrypto Opentest.c
-I
应指向包含openssl
文件夹的目录。
我的英文不是很好,但是我在中文网页上find了这个问题的补丁
yum install openssl yum install openssl-devel
安装这个和tha的它,testing在centos 5.4和keepalived 1.2.7]
如果OpenSSL头文件位于当前目录的openssl
子目录中,请使用:
gcc -I. -o Opentest Opentest.c -lcrypto
预处理器将在-I
选项中的“ .
”中创build一个名称,例如“ ./openssl/ssl.h
”,并在尖括号中指定名称。 如果你用双引号( #include "openssl/ssl.h"
)指定了名字,你可能不需要问这个问题; Unix上的编译器通常会自动在当前目录中search用双引号括起来的头文件,但是对于包含在尖括号( #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}
您可以从中注意到Include目录path和Libspath。 现在你的包含文件的前缀是/home/username/Programming
。 因此你的包含文件选项应该是-I//home/username/Programming
。
(是的,我从上面的评论中得到了它)
这只是删除关于标题的日志。 你也可以提供-L<Lib path>
选项来连接-lcrypto
库。
对于这个gcc错误,你应该引用关于searchpath的gcc文档 。
简而言之:
1)如果在#include中使用尖括号(<>),gcc将首先从系统path(例如/ usr / local / include和/ usr / include等)中search头文件。
2)-L dir命令行选项指定的path将在默认目录之前被search。
3)如果使用#include作为#include“file”使用引号(“”),则会首先search包含当前文件的目录。
所以,你的问题的答案如下:
1)如果要在源代码文件夹中使用头文件,请在#include指令中将“>”replace为“”。
2)如果你想使用-I命令行选项,把它添加到你的编译命令行(如果在环境variables中设置CFLAGS,它将不会自动引用)
3)关于软件包configuration(openssl.pc),我不认为它会被引用没有显式声明在构buildconfiguration。