我使用的是Ubuntu 16.10,它在版本1.0.2g中使用openssl。我已经从网站上下载了最新的源代码openssl-1.1.0c并对其进行了编译,并对其进行了罚款。现在我已经下载了示例代码并尝试编译它,但我发现了链接错误。
rm -f ./cert.o
gcc -c -o cert.o cert.c
gcc -Wall -g -fPIC -I../../libraries/c/openssl-1.1.0c/include/openssl -o cert ./cert.o ../../libraries/c/openssl-1.1.0c/libssl.a ../../libraries/c/openssl-1.1.0c/libcrypto.a -lpthread -ldl
./cert.o: In Funktion `main':
cert.c:(.text+0x48d): Nicht definierter Verweis auf `sk_new_null'
cert.c:(.text+0x4d4): Nicht definierter Verweis auf `sk_push'
cert.c:(.text+0x74e): Nicht definierter Verweis auf `sk_free'
collect2: error: ld returned 1 exit status
Makefile:13: die Regel für Ziel „cert“ scheiterte
make: *** [cert] Fehler 1
生成文件:
appname := cert
CC := gcc
CCFLAGS := -Wall -g -fPIC -I../../libraries/c/openssl-1.1.0c/include/openssl
LDLIBS := ../../libraries/c/openssl-1.1.0c/libssl.a ../../libraries/c/openssl-1.1.0c/libcrypto.a -lpthread -ldl
srcfiles := $(shell find . -maxdepth 1 -name "*.c")
objects := $(patsubst %.c, %.o, $(srcfiles))
all: clean $(appname)
$(appname): $(objects)
$(CC) $(CCFLAGS) $(LDFLAGS) -o $(appname) $(objects) $(LDLIBS)
clean:
rm -f $(objects)
所以我一直在寻找" sk_new_null"在" /usr/include/openssl/stack.h"中找到了它。 在openssl-1.1.0c中,它被重命名为" OPENSSL_sk_new_null"。
我认为,它会查找错误的标头文件。 我是C中的菜鸟,我如何更改Makefile?
答案 0 :(得分:0)
我改变了错误的路径,但几乎没有效果,也有错过的引用。它似乎在" / usr / include"中使用了一些openssl-header。
但是我学到了很多教训,使用" make install"。我已将openssl-1.1.0c配置为" ../../ libraries / c / usr"的前缀路径。使用nanomsg,我做了同样的事情。
然后我添加" -I ../../ libraries / c / usr / include"和" -L ../../ libraries / c / usr / lib"到CFLAGS。有用。我可以静态和动态地链接到这些库,它使用正确的头文件。
我现在总是将它安装到相对路径并指向它。