2010-12-04 67 views
12

我已经从源代码(一个故意旧版本;用./config && make && make test构建)构建OpenSSL,并且宁愿使用我已经构建而没有执行make install来链接我的程序。将OpenSSL库链接到程序

多数民众赞成失败的命令是:

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的错误?或者我该如何最好地解决这个问题?

回答

23

愚蠢的“Linux主义”罢工了!很显然,我需要改变我的命令使得-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

+15

这是`-lssl -lcrypto`,需要在最后。当链接器扫描库时,只链接已经存在未定义引用的函数。所以你需要把“消费”对象放在链接行的开始处,并在末尾放置“提供”对象。 – caf 2010-12-06 01:35:40

+1

我总是很奇怪接受我自己的答案。我现在会切换它。 – mrduclaw 2014-03-29 15:10:50

+0

它对llvm族有什么不同? – saruftw 2017-06-13 19:05:26

4

为什么你不希望使用make install?它可以在你想要的目录复制生成的二进制文件,如果你以前它传递给./configure --prefix $HOME/target_library_install_directory

如果你使用这种伎俩与每个库构建和安装,那么你可以加入目标目录到LIBRARY_PATH环境变量,避免使用 - L选项。

1

如果您使用Autotools,或者您正在构建一个像cURL这样的Autools项目,那么您应该可以使用pkg-config。这个想法是Autotools软件包将读取OpenSSL的软件包配置,并且事情将“为您工作”。

OpenSSL程序包配置库名称为openssl

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

%.o: %.c 
     $(CC) -o [email protected] -c `pkg-config --cflags openssl` $^ 

target: foo.o bar.o baz.o 
     $(CC) -o [email protected] `pkg-config --libs openssl` $^ 

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