引用openssl库封装Base64/RSA/3DES加密库,MAC下通过Makefile编译这个库为.a的问题

信阳毛尖 2015-05-17 08:14:15
openssl库在MAC下已经编译完成,生成了armv7和armv7s两个版本的.a文件,其中要用到的就是libcrypto.a这个静态库

封装Base64/RSA/3DES加密库使用的是c代码,包括头文件.h和实现文件.cpp并引用openssl库使用cgywin+ndk已经编译成成linux版本

现要编译成MAC版本的供ios使用,在mac下的工程目录如下图所示:


Makefile如下:

TARGET = output/libYDEncryption.a
CC= /Applications/XCode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/clang -arch armv7
CFLAG= -DOPENSSL_THREADS -pthread -D_THREAD_SAFE -D_REENTRANT -DDSO_DLFCN -DHAVE_DLFCN_H -DTERMIOS -O3 -fomit-frame-pointer -Wall -isysroot /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS8.2.sdk

SRC_DIR = src
LIBSSL_INCDIR = openssl/include
LIBSSL_LIB_DIR7 = lib/armv7/
LIBSSL_LIB_DIR7s = lib/armv7s/

SRC = $SRC_DIR/*.cpp

INCLUDE += -Iinc \
-I$(LIBSSL_INCDIR )

OBJS = EDCryption.o
libYDEncryption.a:$(OBJS)
$(CC) $(CFLAG) -L$(LIBSSL_LIB_DIR7) $(OBJS) -o libYDEncryption.a -lcrypto -ldl -lstdc++ -lz

EDCryption.o:$(SRC_DIR)/EDCryption.cpp inc/EDCryption.h
$(CC) $(CFLAG) $(INCLUDE) -c $(SRC_DIR)/EDCryption.cpp

clean:
rm -f $(OBJS) output/*.*


其中CCCFLAG就是当前MAC系统的编译环境,跟编译openssl源码库时使用的CCCFLAG一模一样

上述Makefile中定义的目录变量也都不存在任何问题,然而通过MAC的终端工具今日工程目录后执行make编译的时候出现如下错误:
Undefined symbols for architecture armv7:
"_main", referenced from:
implicit entry/start for main executable
ld:symbol(s) not found for architecture armv7
clang: error: linker command failed with exit code 1 (use -v to see invocation)
make:***[xxxxx.a] Error 1

从错误信息来看,应该是第三方库libcrypto.a没有引入成功,然而从上面的Makefile内容来看,libcrypto.a引入应该没问题啊:
libYDEncryption.a:$(OBJS)
$(CC) $(CFLAG) -L$(LIBSSL_LIB_DIR7) $(OBJS) -o libYDEncryption.a -lcrypto -ldl -lstdc++ -lz
这句不报错呀!(如果把这句中的-lcrypto改成-lcryptoxxx会报 ld: library not found for -lcryptoxxx

实在是没招儿了,望大家指点一二
...全文
624 6 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
信阳毛尖 2015-05-20
  • 打赏
  • 举报
回复
关于std报错的问题,在Link Binary With Libraries不仅要添加了libstdc++.dylib这个std库,还有添加libc++.dylib这个c++库的支持
信阳毛尖 2015-05-20
  • 打赏
  • 举报
回复
后来我用Xcode创建了一个静态库工程,把相关文件导入工程中,通过Xcode编译通过了,生成了libYDEncryption.a库文件 现在的问题是,在应用项目上引用libYDEncryption.a库中的函数,报std错误: Undefined symbols for architecture i386: "std::__1::locale::use_facet(std::__1::locale::id&) const", referenced from: _IRSAxxx in libYDEncryption.a(EDCryption.o) _IRSAxxoo in libYDEncryption.a(EDCryption.o) std::__1::basic_ostream<char, std::__1::char_traits<char> >& std::__1::__put_character_sequence<char, std::__1::char_traits<char> >(std::__1::basic_ostream<char, std::__1::char_traits<char> >&, char const*, unsigned long) in libYDEncryption.a(EDCryption.o) 实际上我在targets上Build Phases选项中的Link Binary With Libraries已经添加了libstdc++.dylib这个std库的引用了,不知何故
信阳毛尖 2015-05-20
  • 打赏
  • 举报
回复
引用 3 楼 boise 的回复:
Mac自带有Openssl的库了啊。
you sure?
bjgxjob 2015-05-19
  • 打赏
  • 举报
回复
Mac自带有Openssl的库了啊。
信阳毛尖 2015-05-18
  • 打赏
  • 举报
回复
自顶一下。。。。。
梦一场Monster 2015-05-18
  • 打赏
  • 举报
回复
太高端

29,049

社区成员

发帖
与我相关
我的任务
社区描述
主要讨论与iOS相关的软件和技术
社区管理员
  • iOS
  • 大熊猫侯佩
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧