将OpenSSL库链接到程序

时间:2010-12-04 08:00:39

标签: linux gcc openssl

我已经从源代码构建了OpenSSL(故意使用旧版本;使用./config && make && make test构建)并且更愿意使用我构建的内容而不用make install来链接我的程序。

失败的命令是:

gcc -Wall -Wextra -Werror -static -Lopenssl/openssl-0.9.8k/ -lssl -lcrypto 
-Iopenssl/openssl-0.9.8k/include -o myApp source1.o source2.o common.o`

我收到一系列类似的错误:

common.c:(.text+0x1ea): undefined reference to `SSL_write'

这让我觉得我的OpenSSL有点时髦。如果我从命令中省略-Lopenssl/openssl-0.9.8k/,则错误将变为无法执行:

/usr/bin/ld: cannot find -lssl
/usr/bin/ld: cannot find -lcrypto

我是否错误地编译了OpenSSL?或者我该如何最好地解决这个问题?

3 个答案:

答案 0 :(得分:26)

愚蠢的“Linux-isms”再次罢工!显然,我需要更改我的命令,以使-L-l内容最终(尽管man gcc似乎表示):

gcc -Wall -Wextra -Werror -static -o myApp source1.o source2.o common.o -Lopenssl/openssl-0.9.8k/ -lssl -lcrypto -Iopenssl/openssl-0.9.8k/include

答案 1 :(得分:5)

为什么不想使用make install?如果您之前将生成的二进制文件传递给./configure --prefix $HOME/target_library_install_directory

,它可以将生成的二进制文件复制到您想要的目录中

如果您对构建和安装的每个库都使用了此技巧,则可以将目标目录添加到LIBRARY_PATH环境变量中,并避免使用-L选项。

答案 2 :(得分:3)

如果您使用Autotools,或者您正在构建像cURL这样的Autools项目,那么您应该可以使用pkg-config。我们的想法是Autotools软件包将读取OpenSSL的软件包配置,这些东西将“正常工作”。

OpenSSL包配置库名称为openssl

您可以在基于makefile的项目中使用它。

%.o: %.c
        $(CC) -o $@ -c `pkg-config --cflags openssl` $^

target: foo.o bar.o baz.o
        $(CC) -o $@ `pkg-config --libs openssl` $^

另见How to use pkg-config in MakeHow to use pkg-config to link a library statically