0

我正在尝试创建一个要链接的共享库,该库OpenSSL-1.0.2p依赖于libssl1.0. 然而OpenSSL-1.1.1,在我的 ubuntu 仿生机器上安装的 OpenSSL 版本是内部使用libssl1.1的 .

由于我不希望在系统范围内安装 OpenSSL-1.0,因此我下载并编译了它,并将其单独安装到我的主目录中的一个文件夹中。

我希望使用我希望我的共享库链接的这个位置。这是我要创建的共享库的 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>

虽然角括号应该告诉编译器查看系统的头文件,但-L命令行上的-I标志和标志不是强制它在查看系统文件之前在上述目录中查找它们吗?

crypto.h在 OpenSSL 的自定义安装位置确实有一个文件,但由于某种原因编译器似乎忽略了它

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

前者不应该后者多吗?这与我的“应用程序”是共享库这一事实有关吗?即使那样,它不应该从它链接的任何静态库中提取所有符号(至少是全局符号)吗?

更新 2:现在显然因为我遇到了 SSL 符号的问题,我转而创建一个静态库,因此对 makefile 进行了相应的更改。

4

1 回答 1

1

在这一行:

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”上。

于 2019-10-30T12:34:45.290 回答