c - 安装 OpenSSL 和 libcrypt 库的仅限项目的非系统版本
问题描述
我有一个 C 项目,内容如下Makefile
:
CC=mpicc
buildsDir: ./builds
mkdir ./builds
main: ./builds message dh main.c
$(CC) -o ./builds/main main.c ./builds/dh.o ./builds/message.o -g -lcrypto -lssl
dh: ./builds dh.c dh.h
$(CC) -c -o ./builds/dh.o dh.c -g -lcrypto -lssl
message: message.c message.h
$(CC) -c -o ./builds/message.o -g ./message.c
run: main
mpirun -quiet -np 3 xterm -hold -e ./builds/main &
debug: main
mpirun -quiet -np 3 xterm -e gdb ./builds/main
.PHONY: clean
clean:
rm -rf ./builds && mkdir ./builds
在我的系统中,我有 OpenSSL 1.0.2g:
OpenSSL 1.0.2g 1 Mar 2016
built on: reproducible build, date unspecified
platform: debian-amd64
options: bn(64,64) rc4(16x,int) des(idx,cisc,16,int) blowfish(idx)
compiler: cc -I. -I.. -I../include -fPIC -DOPENSSL_PIC -DOPENSSL_THREADS -D_REENTRANT -DDSO_DLFCN -DHAVE_DLFCN_H -m64 -DL_ENDIAN -g -O2 -fstack-protector-strong -Wformat -Werror=format-security -Wdate-time -D_FORTIFY_SOURCE=2 -Wl,-Bsymbolic-functions -Wl,-z,relro -Wa,--noexecstack -Wall -DMD32_REG_T=int -DOPENSSL_IA32_SSE2 -DOPENSSL_BN_ASM_MONT -DOPENSSL_BN_ASM_MONT5 -DOPENSSL_BN_ASM_GF2m -DSHA1_ASM -DSHA256_ASM -DSHA512_ASM -DMD5_ASM -DAES_ASM -DVPAES_ASM -DBSAES_ASM -DWHIRLPOOL_ASM -DGHASH_ASM -DECP_NISTZ256_ASM
OPENSSLDIR: "/usr/lib/ssl"
但是在我的原型软件上,由于缺少系统提供的版本,我需要它的更高版本,并且我想避免在全球范围内安装它。因此,我想使用仅限本地版本的专业项目范围。我发现这些说明为我提供了一个很好的框架。
我也做了第一步添加是作为我的项目的子模块:
[submodule "openssl"]
path = openssl
url = https://github.com/openssl/openssl.git
branch = OPENSSL_1_1_1a
在控制台上,我尝试使用以下命令集手动构建它:
cd openssl
./config --prefix=$(pwd)/../builds/openssl --openssldir=$(pwd)/../builds/openssl
make && make test && make install
现在我想更进一步,以某种方式mpicc
联系以某种方式位于builds
目录的构建 openssl lib,但我不知道。
解决方案
像这样改变你的makefile怎么样?
CC=mpicc
# use headers from builds/openssl
CFLAGS := -g -Ibuilds/openssl/include
# look for library in builds/openssl
LDFLAGS := -Lbuilds/openssl/lib
LIBS := -lcrypto -lssl
.PHONY: all
all: builds/main
builds:
mkdir -p $@
builds/main: builds/dh.o builds/message.o
builds/main: main.c
$(CC) $(CFLAGS) -o $@ $< builds/dh.o builds/message.o $(LDFLAGS) $(LIBS)
builds/dh.o: dh.h
builds/dh.o: dh.c
$(CC) $(CFLAGS) -o $@ -c $<
builds/message.o: message.h
builds/message.o: message.c
$(CC) $(CFLAGS) -o $@ -c $<
builds/dh.o builds/message.o builds/main: builds
# if you want to build openssl with your makefile...
builds/dh.o builds/message.o builds/main: builds/openssl
builds/openssl: builds
.... your openssl build command ....
请检查builds/openssl
正确的包含和库路径的布局。
奖金代码个人我会重组makefile。为什么不让 make 处理繁重的工作呢?
LDFLAGS := -g -Lbuilds/openssl/lib
SRCS := main.c dh.c message.c
OBJS := $(SRCS:%.c=builds/%.o)
...
builds/main: $(OBJS)
$(CC) $(LDFLAGS) -o $@ $^ $(LIBS)
# do not re-build when "builds" directory contents change
$(OBJS): | builds
$(OBJS): builds/%.o: %.c
$(CC) $(CFLAGS) -o $@ -c $<
# if you want to build openssl with your makefile...
$(OBJS): builds/openssl
推荐阅读
- c# - 无法读取对等记录
- email - CSS 背景图像“图像”未显示在 Outlook 中
- firebase - 如何从firebase获取特定时间戳后的数据
- gcc - Linux bootc.c 中的 GCC 内联汇编:汇编程序消息:错误:表达式后出现垃圾 'int 0x10h'
- java - 如何使用 Scanner.hasNextInt() 检查下一个 3 输入是否为 int 并仅在 java 中循环
- google-app-maker - 舍入绑定表达式 appmaker
- javascript - 稍微调整一下我的图像滑块(添加过渡动画)
- c# - 如何使用自适应卡片从 FormFlow 中保存和检索用户响应?
- python - 如何使用用户名是别名的 OAuth2.0 对 Office365 用户进行身份验证?
- opentext - OpenText Content Suite Platform:用于查找用户类型的数据库表