链接安装在自定义位置的 SSL 和加密库时出错
Error linking SSL and crypto libraries installed in custom location
我正在尝试创建一个共享库,该库将根据 OpenSSL-1.0.2p
进行 link 编辑,这取决于 libssl1.0
。然而,我的 ubuntu 仿生机器上安装的 OpenSSL 版本是 OpenSSL-1.1.1
,它在内部使用 libssl1.1
.
因为我不想在系统范围内安装 OpenSSL-1.0,所以我单独下载并编译它,将它安装到我的主目录中的一个文件夹中。
我希望使用此位置,我希望我的共享库针对该位置 link。这是我要创建的共享库的 Makefile:
APPBASE=/home/AB/Documents/APP/APP_2.17.0
OPENSSL1.0.2p_INSTALL_LOC=/home/AB/Documents/APP/OpenSSL-1.0.2p-installation
CC=gcc
#CFLAGS= -Wall -g -O -fPIC
CFLAGS= -Wall -g -O -static
RM= rm -f
.PHONY: all clean
src=$(wildcard *Generic/*.c *Linux/*.c)
$(info source=$(src))
#we use the custom compiled openssl version
#and NOT the one available on the system
#INC=-I/usr/include/openssl
INC+=-I$(OPENSSL1.0.2p_INSTALL_LOC)/include/openssl
INC+=$(foreach d,$(incdir),-I$d)
$(info includes=$(INC))
LIB=-L$(OPENSSL1.0.2p_INSTALL_LOC)/lib
LIB+=-l:libssl.a -l:libcrypto.a
# looks like we need this for proper static linking of libc
LIB+= -static-libgcc
$(info links=$(LIB))
obj=$(src:.c=.o)
#all: libAPP.so
all: libAPP.a
clean:
$(RM) *.o *.so
$(shell find $(APPBASE) -type f -iname "*.o" -exec rm -rf {} \;)
.c.o:
${CC} ${CFLAGS} $(INC) -c $< -o $@
#${CC} ${CFLAGS} $(INC) -c $< -o $@
libAPP.a: $(obj)
@ar rcs $@ $^
#$(LINK.c) -shared $^ -o $@
但是,make 报告所包含的头文件来自系统的 openssl 安装,因此编译失败(因为它需要 OpenSSL-1.0.2p)。这是一个示例:
In file included from /usr/include/openssl/e_os2.h:13:0,
from /usr/include/openssl/bio.h:13,
from /usr/include/openssl/x509v3.h:13,
.... (source file 1)
gcc -static -Wall -g -O -fPIC -I/home/AB/Documents/APP/OpenSSL-1.0.2p-installation/include/openssl -I*/path/to/app/include1* -I*/path/to/app/include2* -c */path/to/src1* -L/home/AB/Documents/APP/OpenSSL-1.0.2p-installation/lib -lssl -lcrypto
sr1.c: In function ‘Get_CACertificates’: warning: implicit declaration of function ‘CRYPTO_w_lock’; did you mean ‘CRYPTO_zalloc’? [-Wimplicit-function-declaration]
CRYPTO_w_lock(CRYPTO_LOCK_X509_STORE);
^~~~~~~~~~~~~
CRYPTO_zalloc
CRYPTO_w_lock
是一个宏,它不再出现在最新版本的 crypto.h (OpenSSL-1.1)
中,这清楚地表明我的应用程序仍在查看 OpenSSL 的系统版本。
在我的源文件中,我包含了 SSL 头文件,如下所示:
#include <openssl/bio.h>
#include <openssl/ssl.h>
#include <openssl/err.h>
虽然 angular 大括号应该告诉编译器查看系统的头文件,但命令行上的 -L
以及 -I
标志是否强制在查看系统文件之前在上述目录中查找它们?
我在 OpenSSL 的自定义安装位置确实有一个 crypto.h
文件,但编译器似乎出于某种原因忽略了它
ab@ab1-pc:/home/AB/Documents/APP/OpenSSL-1.0.2p-installation$ find . -iname "crypto.h"
./include/openssl/crypto.h
我在这里错过了什么?
更新 1:按照 Darren 的建议,删除了尾随的 openssl 所以现在我的包含路径是
INC+=-I$(OPENSSL1.0.2p_INSTALL_LOC)/include
瞧,我可以看到正在创建共享库。但是,当我尝试在这个新创建的共享库中查找对 ssl 的引用时,我发现我有 87 个条目(其中包括具有 ssl 的所有符号作为他们名字的一部分)
ab@ab1-pc:~/Documents/AB/APP_2.17.0$ nm libAPP.so | grep -i "ssl" | wc -l
87
而仅列出 来自 libssl.a
的全局符号告诉我它有 1113 个全局定义的符号。
ab@ab1-pc:~/Documents/AB/APP_2.17.0$ nm -g ../OpenSSL-1.0.2p-installation/lib/libssl.a | grep -i "ssl" | wc -l
1113
前者不应该比后者多吗?这与我的 'app' 是共享库这一事实有关吗?即便如此,它不应该从它 link 反对的任何静态库中提取所有符号(至少是全局符号)吗??
更新 2:现在显然因为我遇到了 SSL 符号问题,所以我转而创建静态库,因此对相应的生成文件。
这一行:
INC+=-I$(OPENSSL1.0.2p_INSTALL_LOC)/include/openssl
...尝试将其更改为:
INC+=-I$(OPENSSL1.0.2p_INSTALL_LOC)/include
... 即没有 'openssl' 部分。
您的包括,例如,
#include <openssl/bio.h>
#include <openssl/ssl.h>
#include <openssl/err.h>
...期望目录搜索路径终止于 'include/',而不是 'openssl'。
我正在尝试创建一个共享库,该库将根据 OpenSSL-1.0.2p
进行 link 编辑,这取决于 libssl1.0
。然而,我的 ubuntu 仿生机器上安装的 OpenSSL 版本是 OpenSSL-1.1.1
,它在内部使用 libssl1.1
.
因为我不想在系统范围内安装 OpenSSL-1.0,所以我单独下载并编译它,将它安装到我的主目录中的一个文件夹中。
我希望使用此位置,我希望我的共享库针对该位置 link。这是我要创建的共享库的 Makefile:
APPBASE=/home/AB/Documents/APP/APP_2.17.0
OPENSSL1.0.2p_INSTALL_LOC=/home/AB/Documents/APP/OpenSSL-1.0.2p-installation
CC=gcc
#CFLAGS= -Wall -g -O -fPIC
CFLAGS= -Wall -g -O -static
RM= rm -f
.PHONY: all clean
src=$(wildcard *Generic/*.c *Linux/*.c)
$(info source=$(src))
#we use the custom compiled openssl version
#and NOT the one available on the system
#INC=-I/usr/include/openssl
INC+=-I$(OPENSSL1.0.2p_INSTALL_LOC)/include/openssl
INC+=$(foreach d,$(incdir),-I$d)
$(info includes=$(INC))
LIB=-L$(OPENSSL1.0.2p_INSTALL_LOC)/lib
LIB+=-l:libssl.a -l:libcrypto.a
# looks like we need this for proper static linking of libc
LIB+= -static-libgcc
$(info links=$(LIB))
obj=$(src:.c=.o)
#all: libAPP.so
all: libAPP.a
clean:
$(RM) *.o *.so
$(shell find $(APPBASE) -type f -iname "*.o" -exec rm -rf {} \;)
.c.o:
${CC} ${CFLAGS} $(INC) -c $< -o $@
#${CC} ${CFLAGS} $(INC) -c $< -o $@
libAPP.a: $(obj)
@ar rcs $@ $^
#$(LINK.c) -shared $^ -o $@
但是,make 报告所包含的头文件来自系统的 openssl 安装,因此编译失败(因为它需要 OpenSSL-1.0.2p)。这是一个示例:
In file included from /usr/include/openssl/e_os2.h:13:0,
from /usr/include/openssl/bio.h:13,
from /usr/include/openssl/x509v3.h:13,
.... (source file 1)
gcc -static -Wall -g -O -fPIC -I/home/AB/Documents/APP/OpenSSL-1.0.2p-installation/include/openssl -I*/path/to/app/include1* -I*/path/to/app/include2* -c */path/to/src1* -L/home/AB/Documents/APP/OpenSSL-1.0.2p-installation/lib -lssl -lcrypto
sr1.c: In function ‘Get_CACertificates’: warning: implicit declaration of function ‘CRYPTO_w_lock’; did you mean ‘CRYPTO_zalloc’? [-Wimplicit-function-declaration]
CRYPTO_w_lock(CRYPTO_LOCK_X509_STORE);
^~~~~~~~~~~~~
CRYPTO_zalloc
CRYPTO_w_lock
是一个宏,它不再出现在最新版本的 crypto.h (OpenSSL-1.1)
中,这清楚地表明我的应用程序仍在查看 OpenSSL 的系统版本。
在我的源文件中,我包含了 SSL 头文件,如下所示:
#include <openssl/bio.h>
#include <openssl/ssl.h>
#include <openssl/err.h>
虽然 angular 大括号应该告诉编译器查看系统的头文件,但命令行上的 -L
以及 -I
标志是否强制在查看系统文件之前在上述目录中查找它们?
我在 OpenSSL 的自定义安装位置确实有一个 crypto.h
文件,但编译器似乎出于某种原因忽略了它
ab@ab1-pc:/home/AB/Documents/APP/OpenSSL-1.0.2p-installation$ find . -iname "crypto.h"
./include/openssl/crypto.h
我在这里错过了什么?
更新 1:按照 Darren 的建议,删除了尾随的 openssl 所以现在我的包含路径是
INC+=-I$(OPENSSL1.0.2p_INSTALL_LOC)/include
瞧,我可以看到正在创建共享库。但是,当我尝试在这个新创建的共享库中查找对 ssl 的引用时,我发现我有 87 个条目(其中包括具有 ssl 的所有符号作为他们名字的一部分)
ab@ab1-pc:~/Documents/AB/APP_2.17.0$ nm libAPP.so | grep -i "ssl" | wc -l
87
而仅列出 来自 libssl.a
的全局符号告诉我它有 1113 个全局定义的符号。
ab@ab1-pc:~/Documents/AB/APP_2.17.0$ nm -g ../OpenSSL-1.0.2p-installation/lib/libssl.a | grep -i "ssl" | wc -l
1113
前者不应该比后者多吗?这与我的 'app' 是共享库这一事实有关吗?即便如此,它不应该从它 link 反对的任何静态库中提取所有符号(至少是全局符号)吗??
更新 2:现在显然因为我遇到了 SSL 符号问题,所以我转而创建静态库,因此对相应的生成文件。
这一行:
INC+=-I$(OPENSSL1.0.2p_INSTALL_LOC)/include/openssl
...尝试将其更改为:
INC+=-I$(OPENSSL1.0.2p_INSTALL_LOC)/include
... 即没有 'openssl' 部分。
您的包括,例如,
#include <openssl/bio.h>
#include <openssl/ssl.h>
#include <openssl/err.h>
...期望目录搜索路径终止于 'include/',而不是 'openssl'。