针对OpenSSL构建程序(sscep):未定义引用'[...]'

时间:2012-05-10 12:03:09

标签: windows gcc openssl mingw

我正在尝试为Windows构建一个名为sscep(http://www.klake.org/~jt/sscep/)的工具。它本身不运行,我有一个“补丁”,它改变了sscep,使其在Windows上编译。 应用补丁后,它完全编译,但链接器会拧紧。我在minGW / msys中使用gcc 最初的消息是它无法找到加密库,所以我添加了库“-L ../ openssl-mingw / lib”,然后没有再创建错误。我的命令中也有命令行开关-lcrypto:gcc -L../openssl-mingw/lib -lcrypto sscep.o init.o net.o sceputils.o pkcs7.o ias.o fileutils.o -o sscep。在这个目录中是libcrypto.a。 OpenSSL本身是使用完全相同的编译器编译的,只运行./config && make && make test && make install。还使用minGW tar提取源,而不是7-zip。

在完成所有文档之后,这是我的(截断的)输出:

sscep.o:sscep.c:(.text+0x83): undefined reference to `WSAStartup@8'
sscep.o:sscep.c:(.text+0xa5): undefined reference to `WSACleanup@0'
sscep.o:sscep.c:(.text+0x3d5): undefined reference to `BIO_new_mem_buf'
sscep.o:sscep.c:(.text+0x3e0): undefined reference to `ASN1_INTEGER_new'
sscep.o:sscep.c:(.text+0x414): undefined reference to `a2i_ASN1_INTEGER'
sscep.o:sscep.c:(.text+0x432): undefined reference to `ASN1_INTEGER_to_BN'
sscep.o:sscep.c:(.text+0x448): undefined reference to `BN_bn2dec'
sscep.o:sscep.c:(.text+0xb7e): undefined reference to `EVP_des_cbc'
sscep.o:sscep.c:(.text+0xbaf): undefined reference to `EVP_bf_cbc'
sscep.o:sscep.c:(.text+0xbda): undefined reference to `EVP_des_cbc'
sscep.o:sscep.c:(.text+0xc02): undefined reference to `EVP_des_ede3_cbc'
sscep.o:sscep.c:(.text+0xc48): undefined reference to `EVP_md5'
sscep.o:sscep.c:(.text+0xc79): undefined reference to `EVP_md5'
sscep.o:sscep.c:(.text+0xca1): undefined reference to `EVP_sha1'

对于那里的每个文件都会继续,并且据称每个函数都被调用。 在这里搜索和谷歌导致一个丢失的库,但从上面省略-L指令我得到另一个错误,没有找到libcrypto。所以我假设实际上找到了这个库,但有些地址有些错误?

这里我的编译器/链接器知识实际上已经结束。 如果补丁可能对此负责(我不相信,因为这些都是openssl函数和编译工作),那么我可以为你提供它。

编辑:我应该提供任何信息,以便有人可以帮助我吗?如果这有任何区别,openssl的版本是1.0.1。 关于这个主题:如果它确实有所作为,可能由于版本错误而发生此错误。据我理解链接器理论,这个错误不应该来自错误的版本,除非以下函数的所有被不同命名的函数替换(但编译器会抱怨,我猜?)。

另外一个补充:由于我在64位Windows 7上,我试图用-m32标志编译它,但这没有帮助。我假设因为mingw已经只有32位,我甚至无法构建x64。另一个问题是我在AMD Opteron上的虚拟化环境中运行是否存在问题,而openssl是使用命令“-march = i486”构建的?

1 个答案:

答案 0 :(得分:1)

在一些帮助下,我终于可以搞清楚了!这是订单的问题和缺少库的问题。这个组合杀死了我。

图书馆必须-lcrypto -lws2_32 -lgdi32而不仅仅是-lcrypto。此外,我必须在目标文件之后追加,因此:$(CC) $(CFLAGS) $(OBJS) -lcrypto -lws2_32 -lgdi32 -o $(PROG)是正确的生产线。

最后这个,编译得很好。我甚至不需要任何架构标志等。