我已经从源代码构建了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?或者我该如何最好地解决这个问题?
答案 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 Make和How to use pkg-config to link a library statically。