错误链接到安装在自定义位置的SSL和加密库

问题描述 投票:0回答:1

我正在尝试创建一个要与OpenSSL-1.0.2p链接的共享库,该库依赖于libssl1.0。在我的ubuntu仿生机器上,OpenSSL的安装版本为OpenSSL-1.1.1,内部使用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
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=-llibssl -llibcrypto
LIB+=-lssl -lcrypto
$(info links=$(LIB))
#LIB+=-L/usr/lib/

obj=$(src:.c=.o)
all: libAPP.so
clean:
    $(RM) *.o *.so

.c.o:
    ${CC} -static ${CFLAGS} $(INC) -c $< $(LIB)
    #LD_LIBRARY_PATH=$(OPENSSL1.0.2p_INSTALL_LOC)/lib ${CC} -static ${CFLAGS} $(INC) -c $< $(LIB)

libAPP.so: $(obj)
    $(LINK.c) -shared $< -o $@

但是,请报告包含的头文件来自系统的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标志都不会迫使它在查找之前在上述目录中查找它们在系统文件?

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

ab@ab1-pc:/home/AB/Documents/APP/OpenSSL-1.0.2p-installation$ find . -iname "crypto.h"
./include/openssl/crypto.h

我现在机智了!!请在这里告诉我我想念的是什么

makefile openssl linker linker-errors libssl
1个回答
0
投票

在此行:

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'。

© www.soinside.com 2019 - 2024. All rights reserved.