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 |
|
Library |
|
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版本的文件进行替换,问题马上解决了!