Win8下编译openssl成功 最后一步链接出问题的解决办法

nmake过程中,一断的缺少 .h .lib 等文件,不知道如何设置路径 直接复制到 openssl源目录下。成功编译以后


链接程序时出现如下错误:

Building OpenSSL
link /nologo /subsystem:console /opt:ref /debug /dll /out:out32dll\libeay32.dll /def:ms/LIBEAY32.def @C:\Users\HUANGJ~1\AppData\Local\Temp\nm2EA4.tmp
   正在创建库 out32dll\libeay32.lib 和对象 out32dll\libeay32.exp
uplink.obj : error LNK2019: 无法解析的外部符号 __imp__ExitProcess@4,该符号在函数 _unimplemented 中被引用
uplink.obj : error LNK2019: 无法解析的外部符号 __imp__GetModuleHandleA@4,该符号在函数 _OPENSSL_Uplink 中被引用
cryptlib.obj : error LNK2001: 无法解析的外部符号 __imp__GetModuleHandleA@4
uplink.obj : error LNK2019: 无法解析的外部符号 __imp__GetProcAddress@8,该符号在函数 _OPENSSL_Uplink 中被引用
cryptlib.obj : error LNK2001: 无法解析的外部符号 __imp__GetProcAddress@8
dso_win32.obj : error LNK2001: 无法解析的外部符号 __imp__GetProcAddress@8
rand_win.obj : error LNK2001: 无法解析的外部符号 __imp__GetProcAddress@8
cryptlib.obj : error LNK2019: 无法解析的外部符号 __imp__GetStdHandle@4,该符号在函数 _OPENSSL_showfatal 中被引用
ui_openssl.obj : error LNK2001: 无法解析的外部符号 __imp__GetStdHandle@4
cryptlib.obj : error LNK2019: 无法解析的外部符号 __imp__GetFileType@4,该符号在函数 _OPENSSL_showfatal 中被引用
cryptlib.obj : error LNK2019: 无法解析的外部符号 __imp__GetLastError@0,该符号在函数 _OPENSSL_isservice 中被引用
bss_fd.obj : error LNK2001: 无法解析的外部符号 __imp__GetLastError@0
bss_file.obj : error LNK2001: 无法解析的外部符号 __imp__GetLastError@0
cryptlib.obj : error LNK2019: 无法解析的外部符号 __imp__GetCurrentThreadId@0,该符号在函数 _CRYPTO_THREADID_current 中被引用
MSVCRT.lib(gs_support.obj) : error LNK2001: 无法解析的外部符号 __imp__GetCurrentThreadId@0
cryptlib.obj : error LNK2019: 无法解析的外部符号 __imp__GetVersion@0,该符号在函数 _OPENSSL_showfatal 中被引用
rand_win.obj : error LNK2001: 无法解析的外部符号 __imp__GetVersion@0
cryptlib.obj : error LNK2019: 无法解析的外部符号 __imp__DeregisterEventSource@4,该符号在函数 _OPENSSL_showfatal 中被引用
cryptlib.obj : error LNK2019: 无法解析的外部符号 __imp__RegisterEventSourceA@8,该符号在函数 _OPENSSL_showfatal 中被引用
cryptlib.obj : error LNK2019: 无法解析的外部符号 __imp__ReportEventA@36,该符号在函数 _OPENSSL_showfatal 中被引用
cryptlib.obj : error LNK2019: 无法解析的外部符号 __imp__GetProcessWindowStation@0,该符号在函数 _OPENSSL_isservice 中被引用
cryptlib.obj : error LNK2019: 无法解析的外部符号 __imp__GetUserObjectInformationW@20,该符号在函数 _OPENSSL_isservice 中被引用
cryptlib.obj : error LNK2019: 无法解析的外部符号 __imp__MessageBoxA@16,该符号在函数 _OPENSSL_showfatal 中被引用
cryptlib.obj : error LNK2019: 无法解析的外部符号 __imp__GetDesktopWindow@0,该符号在函数 _OPENSSL_isservice 中被引用
o_dir.obj : error LNK2019: 无法解析的外部符号 __imp__FindClose@4,该符号在函数 _OPENSSL_DIR_end 中被引用
o_dir.obj : error LNK2019: 无法解析的外部符号 __imp__FindFirstFileA@8,该符号在函数 _OPENSSL_DIR_read 中被引用
o_dir.obj : error LNK2019: 无法解析的外部符号 __imp__FindNextFileA@8,该符号在函数 _OPENSSL_DIR_read 中被引用
dso_win32.obj : error LNK2019: 无法解析的外部符号 __imp__CloseHandle@4,该符号在函数 _win32_pathbyaddr 中被引用
rand_win.obj : error LNK2001: 无法解析的外部符号 __imp__CloseHandle@4
dso_win32.obj : error LNK2019: 无法解析的外部符号 __imp__FreeLibrary@4,该符号在函数 _win32_load 中被引用
rand_win.obj : error LNK2001: 无法解析的外部符号 __imp__FreeLibrary@4
dso_win32.obj : error LNK2019: 无法解析的外部符号 __imp__LoadLibraryA@4,该符号在函数 _win32_load 中被引用
rand_win.obj : error LNK2001: 无法解析的外部符号 __imp__LoadLibraryA@4
bss_fd.obj : error LNK2019: 无法解析的外部符号 __imp__SetLastError@4,该符号在函数 _fd_write 中被引用
bss_file.obj : error LNK2019: 无法解析的外部符号 __imp__MultiByteToWideChar@24,该符号在函数 _BIO_new_file 中被引用
bss_dgram.obj : error LNK2001: 无法解析的外部符号 __imp__closesocket@4
bss_sock.obj : error LNK2019: 无法解析的外部符号 __imp__closesocket@4,该符号在函数 _sock_free 中被引用
bss_conn.obj : error LNK2001: 无法解析的外部符号 __imp__closesocket@4
b_sock.obj : error LNK2001: 无法解析的外部符号 __imp__closesocket@4
bss_acpt.obj : error LNK2001: 无法解析的外部符号 __imp__closesocket@4
bss_sock.obj : error LNK2019: 无法解析的外部符号 __imp__recv@16,该符号在函数 _sock_read 中被引用
bss_conn.obj : error LNK2001: 无法解析的外部符号 __imp__recv@16
bss_sock.obj : error LNK2019: 无法解析的外部符号 __imp__send@16,该符号在函数 _sock_write 中被引用
bss_conn.obj : error LNK2001: 无法解析的外部符号 __imp__send@16
bss_dgram.obj : error LNK2001: 无法解析的外部符号 __imp__send@16
bss_sock.obj : error LNK2019: 无法解析的外部符号 __imp__shutdown@8,该符号在函数 _sock_free 中被引用
bss_conn.obj : error LNK2001: 无法解析的外部符号 __imp__shutdown@8
bss_acpt.obj : error LNK2001: 无法解析的外部符号 __imp__shutdown@8
bss_dgram.obj : error LNK2001: 无法解析的外部符号 __imp__shutdown@8
bss_sock.obj : error LNK2019: 无法解析的外部符号 __imp__WSASetLastError@4,该符号在函数 _sock_write 中被引用
bss_conn.obj : error LNK2001: 无法解析的外部符号 __imp__WSASetLastError@4
bss_dgram.obj : error LNK2001: 无法解析的外部符号 __imp__WSASetLastError@4
bss_sock.obj : error LNK2019: 无法解析的外部符号 __imp__WSAGetLastError@0,该符号在函数 _sock_write 中被引用
bss_conn.obj : error LNK2001: 无法解析的外部符号 __imp__WSAGetLastError@0
b_sock.obj : error LNK2001: 无法解析的外部符号 __imp__WSAGetLastError@0
bss_dgram.obj : error LNK2001: 无法解析的外部符号 __imp__WSAGetLastError@0
bss_conn.obj : error LNK2019: 无法解析的外部符号 __imp__connect@12,该符号在函数 _conn_state 中被引用
b_sock.obj : error LNK2001: 无法解析的外部符号 __imp__connect@12
bss_conn.obj : error LNK2019: 无法解析的外部符号 __imp__htonl@4,该符号在函数 _conn_state 中被引用
b_sock.obj : error LNK2001: 无法解析的外部符号 __imp__htonl@4
bss_conn.obj : error LNK2019: 无法解析的外部符号 __imp__htons@4,该符号在函数 _conn_state 中被引用
b_sock.obj : error LNK2001: 无法解析的外部符号 __imp__htons@4
bss_conn.obj : error LNK2019: 无法解析的外部符号 __imp__setsockopt@20,该符号在函数 _conn_state 中被引用
b_sock.obj : error LNK2001: 无法解析的外部符号 __imp__setsockopt@20
bss_dgram.obj : error LNK2001: 无法解析的外部符号 __imp__setsockopt@20
bss_conn.obj : error LNK2019: 无法解析的外部符号 __imp__socket@12,该符号在函数 _conn_state 中被引用
b_sock.obj : error LNK2001: 无法解析的外部符号 __imp__socket@12
b_sock.obj : error LNK2019: 无法解析的外部符号 __imp__accept@12,该符号在函数 _BIO_accept 中被引用
b_sock.obj : error LNK2019: 无法解析的外部符号 __imp__bind@12,该符号在函数 _BIO_get_accept_socket 中被引用
b_sock.obj : error LNK2019: 无法解析的外部符号 __imp__ioctlsocket@12,该符号在函数 _BIO_socket_ioctl 中被引用
b_sock.obj : error LNK2019: 无法解析的外部符号 __imp__getsockopt@20,该符号在函数 _BIO_sock_error 中被引用
bss_dgram.obj : error LNK2001: 无法解析的外部符号 __imp__getsockopt@20
b_sock.obj : error LNK2019: 无法解析的外部符号 __imp__listen@8,该符号在函数 _BIO_get_accept_socket 中被引用
b_sock.obj : error LNK2019: 无法解析的外部符号 __imp__ntohl@4,该符号在函数 _BIO_accept 中被引用
b_sock.obj : error LNK2019: 无法解析的外部符号 __imp__ntohs@4,该符号在函数 _BIO_accept 中被引用
b_sock.obj : error LNK2019: 无法解析的外部符号 __imp__gethostbyname@4,该符号在函数 _BIO_get_host_ip 中被引用
b_sock.obj : error LNK2019: 无法解析的外部符号 __imp__getservbyname@8,该符号在函数 _BIO_get_port 中被引用
b_sock.obj : error LNK2019: 无法解析的外部符号 __imp__WSAStartup@8,该符号在函数 _BIO_sock_init 中被引用
b_sock.obj : error LNK2019: 无法解析的外部符号 __imp__WSACleanup@0,该符号在函数 _BIO_sock_cleanup 中被引用
bss_dgram.obj : error LNK2019: 无法解析的外部符号 __imp__recvfrom@24,该符号在函数 _dgram_read 中被引用
bss_dgram.obj : error LNK2019: 无法解析的外部符号 __imp__sendto@24,该符号在函数 _dgram_write 中被引用
rand_win.obj : error LNK2019: 无法解析的外部符号 __imp__QueryPerformanceCounter@4,该符号在函数 _readtimer 中被引用
MSVCRT.lib(gs_support.obj) : error LNK2001: 无法解析的外部符号 __imp__QueryPerformanceCounter@4
rand_win.obj : error LNK2019: 无法解析的外部符号 __imp__GetCurrentProcessId@0,该符号在函数 _RAND_poll 中被引用
MSVCRT.lib(gs_support.obj) : error LNK2001: 无法解析的外部符号 __imp__GetCurrentProcessId@0
rand_win.obj : error LNK2019: 无法解析的外部符号 __imp__GetTickCount@0,该符号在函数 _RAND_poll 中被引用
rand_win.obj : error LNK2019: 无法解析的外部符号 __imp__GetVersionExA@4,该符号在函数 _RAND_poll 中被引用
rand_win.obj : error LNK2019: 无法解析的外部符号 __imp__GlobalMemoryStatus@4,该符号在函数 _RAND_poll 中被引用
ui_openssl.obj : error LNK2019: 无法解析的外部符号 __imp__FlushConsoleInputBuffer@4,该符号在函数 _noecho_fgets 中被引用
MSVCRT.lib(gs_report.obj) : error LNK2019: 无法解析的外部符号 __imp__IsDebuggerPresent@0,该符号在函数 ___raise_securityfailure 中被引用
MSVCRT.lib(gs_report.obj) : error LNK2019: 无法解析的外部符号 _IsProcessorFeaturePresent@4,该符号在函数 ___report_gsfailure 中被引用
MSVCRT.lib(crtdll.obj) : error LNK2019: 无法解析的外部符号 __imp__EncodePointer@4,该符号在函数 _pre_c_init 中被引用
MSVCRT.lib(atonexit.obj) : error LNK2001: 无法解析的外部符号 __imp__EncodePointer@4
MSVCRT.lib(crtdll.obj) : error LNK2019: 无法解析的外部符号 __imp__DecodePointer@4,该符号在函数 __CRT_INIT@12 中被引用
MSVCRT.lib(atonexit.obj) : error LNK2001: 无法解析的外部符号 __imp__DecodePointer@4
MSVCRT.lib(gs_support.obj) : error LNK2019: 无法解析的外部符号 __imp__GetSystemTimeAsFileTime@4,该符号在函数 ___security_init_cookie 中被引用
out32dll\libeay32.dll : fatal error LNK1120: 58 个无法解析的外部命令



解决办法详细分析: 左边看到链接错误的obj文件是uplink.obj, 那么打开uplink.c文件,  根据提示 

无法解析的外部符号 __imp__ExitProcess@4,该符号在函数 _unimplemented 中被引用

在文件中找到unimplemented方法,其中有段代码如下 ExitProcess (1);

几乎没接触过Visual C++的来说,根本不知道ExitProcess方法在哪个文件中定义的。 百度后确认这个是WinAPI中的方法,查看MSDN此方法的详细描述

地址:http://msdn.microsoft.com/en-us/library/windows/desktop/ms682658(v=vs.85).aspx


显示以下内容:

Requirements

Minimum supported client

Windows XP [desktop apps only]

Minimum supported server

Windows Server 2003 [desktop apps only]

Header

WinBase.h on Windows XP, Windows Server 2003, Windows Vista, Windows 7, Windows Server 2008, and Windows Server 2008 R2 (include Windows.h); Processthreadsapi.h on Windows 8 and Windows Server 2012

Library

Kernel32.lib

DLL

Kernel32.dll


重点就在这里:调用此方法 Require Library 是 Kernel32.lib , 那么确定Kernel32.lib文件在openssl源目录下有没有, 发现有的


那么自然想到了Kernel32.lib版本不一样,果然回到win8的C:\Program Files\Windows Kits目录下, 搜索Kernel32.lib 出来三个文件,有X86版的、64位版的、ARM版的。比对

最终确认是Kernel32.lib版本复制错了, 拷了一个ARM版本的Kernel32.lib文件到openssl源目录进行编译。 用X86版本的文件进行替换,问题马上解决了!

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值