如果有问题,请加QQ群 891339868 进行交流
在使用gcc编译代码时,直接调用openssl接口,没有任何错误,为了要对windows兼容,选择使用mingw交叉编译器进行编译,发现出了一大堆儿的错误,现在总结一下,避免以后犯同样的错误:
一、编译时出现“include/openssl/safestack.h:186:16: error: expected expression before ‘)’ token
(type *)sk_pop(CHECKED_STACK_OF(type, st))”
这个错误咋一看,很无厘头,看上去像是语法错误,可是在使用gcc时,并没有发现这个错误,这是为什么呢?产看了openssl的源码,也没发现哪个地方存在语法错误(哈哈,也不可能出现这么低级的错误),进过推断,应该是编译配置的问题,可是编译配置的选项很多,从何查起呢?我总结了一个比较好用的方法,直接使用openssl库编译时的配置,很奏效,这个错误没有了,为什么呢?是哪个配置起作用了呢?经过测试,是WIN32_LEAN_AND_MEAN这个配置起了作用,这个配置是什么意思呢?详细解释可以看这篇文章:#define WIN32_LEAN_AND_MEAN 的作用 - 采男孩的小蘑菇 - 博客园
这个宏的主要作用就是屏蔽了一些不必要的头文件,提高编译速度和减小生成文件的大小,当然,也避免头文件之间的冲突,上面的错误,应该就是windows相关的头文件包含冲突造成的。
二、编译时出现:
“rand_win.c:(.text+0xeed):对‘_imp__GetDeviceCaps@8’未定义的引用”,
“rand_win.c:(.text+0xf1b):对‘_imp__CreateCompatibleBitmap@12’未定义的引用”,
“rand_win.c:(.text+0xf3d):对‘_imp__GetObjectA@12’未定义的引用”
“rand_win.c:(.text+0x102d):对‘_imp__GetDIBits@28’未定义的引用”
“rand_win.c:(.text+0x1091):对‘_imp__DeleteObject@4’未定义的引用”
出现这种情况是链接错误,是相关库没有被链接,因为libcrypto.a需要链接libgdi32.a,所以链接时需要配置-lgdi32。
好了,今天就记录到此!