在Linux下实现了一个有关使用OPENSSL中SHA1算法的程序,直接copy到mac机下编译出现如下错误:
Undefined symbols for architecture x86_64:
"_SHA1_Final", referenced from:
fixSignatureHeader(char*, int) in main.o
"_SHA1_Init", referenced from:
fixSignatureHeader(char*, int) in main.o
"_SHA1_Update", referenced from:
fixSignatureHeader(char*, int) in main.o
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)
Makefile大概如下:
cc = g++
CFLAGS = -g -w -Wall
LIBS = -lssl
CPP_OBJS :=$(patsubst %.cpp,%.o,$(wildcard ./src/*.cpp))
C_OBJS :=$(patsubst %.c,%.o,$(wildcard ./libaes/*.c))
all:$(CPP_OBJS)$(C_OBJS)
$(cc)$(CFLAGS) $(CPP_OBJS)$(C_OBJS) -o ./bin/a.out $(LIBS)
rm -f $(CPP_OBJS)$(C_OBJS)
.cpp.o:
$(cc) -c$(CFLAGS) $< -o$@
.c.o:
$(cc) -c$(CFLAGS) $< -o$@
.PHONY:clean
clean:
rm -f $(CPP_OBJS)$(C_OBJS)
从错误的字面意思应该是对应x86_64架构下的库中找不到“SHA1_Init” “SHA1_Update”这些符号,查了一下x86_64是Mac的模拟编译平台,是64位的,难道是因为这个?然后我编译是添加了-arch i386参数改为了32位编译,但是报了如下错误:
Undefined symbols for architecture i386:
"_main", referenced from:
implicit entry/start for main executable
ld: symbol(s) not found for architecture i386
clang: error: linker command failed with exit code 1 (use -v to see invocation
更加摸不到头脑了,在网上查了半天资料都没有解决办法,但可以肯定是这些符号没有找到,要么是库没有链接正确,要么是少链接什么库。
后来想到Mac下Openssl是Xcode中自带的,我又从官网重新down了一份openssl的源码,然后./Configure darwin64-x86_64-cc,make,make install,并指定了新库的目录,仍然报相同的错,这我就不明白了,我已经将libssl按照x86_64编译生成了,而且我用file命令查看了新生成的openssl命令,确实是x86_64架构,不应该再报找不到x86_64架构下相关符号了。
浪费了一下午时间也没有解决,实在没有办法,用eclipse创建了一个c++项目,在这个工程中引用了sha.h,然后调用相关的函数,最后编译(eclipse会自动生成Makefile),报如下错误:
./src/test.cpp:22:2: warning: 'SHA1_Init' is deprecated: first deprecated in OS X 10.7 [-Wdeprecated-declarations]
SHA1_Init(&c);
。。。。。
Undefined symbols for architecture x86_64:
"_SHA1_Final", referenced from:
_main in ApkProtect.o
"_SHA1_Init", referenced from:
_main in ApkProtect.o
"_SHA1_Update", referenced from:
_main in ApkProtect.o
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)
下面的错误一样,但是多了一些warning,说SHA1相关的函数在OS X 10.7时就已经被deprecated了,然后搜索了解决办法,虽然已经遗弃,但只是建议性的,还是可以使用的,只不过编译的时候要添加-lcrypto,链接:http://stackoverflow.com/questions/19840220/sha1-is-deprecated-first-deprecated-in-os-x-10-7,把libcrypto这个库链接进来,然后就编译通过了!
网上查了一下如果要应用一些加密算法的话建议使用libcrypto这个库,如果涉及到SSL等PKI协议的话建议使用openssl。
花了一整天时间来弄这个东西,真是太浪费时间了,还有好多问题没有解决,比如红字的部分,还有x86_64和i386分别代表什么以及区别,怎样指定x86_64以外的架构等具体的机制等等。由于还有其他工作要做,这些就留待以后搞明白吧。
在Mac上编译使用OpenSSL SHA1算法的C++程序时遇到'Undefined symbols for architecture x86_64'错误。尝试修改Makefile添加-arch参数,更换OpenSSL库,但问题依旧。最终发现需添加'-lcrypto'链接libcrypto库才能解决。警告显示SHA1函数在OS X 10.7已被弃用,但仍然可用。
694

被折叠的 条评论
为什么被折叠?



