VS2008 编译 链接器错误以及使用C语言函数的警告

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/luoyeaijiao/article/details/8508566

在使用VS做项目的时候,在VS2005的版本开始,经常会出现两类错误,一个是在编译的时候,连接器经常死掉,无法成功编译,另外一个是使用了C语言函数后,会发出警告。

下面分别来说说这两个问题的解决方案。


一,链接器无法正常工作的解决方法:

在使用VS开发,进行编译时,往往在语法没有错误的情况下,依然会频繁的出现链接失败,通常情况下,再build一次就好了。这个问题往往是由于增量链接导致的,可以在项目的属性中,进行配置,不进行增量链接,就可以解决这个问题了。具体步骤是,project->Properties->Linker->Enable Incremental Linking设置为No(/Incremental:NO)即可。中文版的是工程->属性->链接->增量链接,设置为NO。默认情况下,这个设置是YES,当设置为NO时,链接器无法正常工作的问题往往都能解决了。


二、使用C语言函数报警告的解决方法:

在开发过程中,若使用了某些C语言函数,可能会遇到很多警告,如

warning C4996: 'strcpy': This function or variable may be unsafe. Consider using strcpy_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.
1>          c:\program files\microsoft visual studio 10.0\vc\include\string.h(105) : 参见“strcpy”的声明
warning C4996: 'fopen': This function or variable may be unsafe. Consider using fopen_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.
1>          c:\program files\microsoft visual studio 10.0\vc\include\stdio.h(234) : 参见“fopen”的声明
等等诸如此类的警告,这些警告,主要因为那些C库的函数,很多函数内部是不进行参数检测的(包括越界类的),微软担心使用这些会造成内存异常,所以就改写了同样功能的函数,改写了的函数进行了参数的检测,使用这些新的函数会更安全和便捷。关于这些改写的函数你不用专门去记忆,因为编译器对于每个函数在给出警告时,都会告诉你相应的安全函数,查看警告信息就可以获知,在使用时也再查看一下MSDN详细了解。
    解决方案:
1> 根据下面的warning提示:参见“fopen”的声明
        消息:“This function or variable may be unsafe. Consider using fopen_s instead. To disable deprecation, use _CRT_SECURE_NO_DEPRECATE. See online help for details.”
        所以可以将函数按warning提示的第二句,改为使用fopen_s函数即可:
        例如:FILE *pFile=fopen("1.txt", "w");
           改为:
           FILE* pFile;
           fopen_s(&pFile, "1.txt", "w");
2> 还是根据warning提示的地三句话:use _CRT_SECURE_NO_DEPRECATE
        项目|属性|配置属性|C/C++|命令行|附加选项,加入(/D "_CRT_SECURE_NO_DEPRECATE" )(注:加入中括号中完整的内容)
3> 降低警告级别:项目|属性|配置属性|C/C++|常规,自己根据情况降低警告级别(此法不推荐)
    注意:高度重视警告:使用编译器的最高警告级别。应该要求构建是干净利落的(没有警告)。理解所有警告。通过修改代码而不是降低警告级别来排除警告。
    编译器是你的朋友。如果它对某个构造发出警告,这经常是说明你的代码中存在潜在的问题。

展开阅读全文

求助 :链接器工具错误 LNK2019 (C++)

04-11

编译下面代码(从 MSDN拷来),通过rn#define _WIN32_WINNT 0x0502rn#include rn#include rn//#includernrn#define MEMORY_REQUESTED 1024*1024 // request a megabyternrnBOOLrnLoggedSetLockPagesPrivilege ( HANDLE hProcess,rn BOOL bEnable);rnrnvoid _cdecl main()rnrn BOOL bResult; // generic Boolean valuern ULONG_PTR NumberOfPages; // number of pages to requestrn ULONG_PTR NumberOfPagesInitial; // initial number of pages requestedrn ULONG_PTR *aPFNs; // page info; holds opaque datarn PVOID lpMemReserved; // AWE windowrn SYSTEM_INFO sSysInfo; // useful system informationrn int PFNArraySize; // memory to request for PFN arrayrnrn GetSystemInfo(&sSysInfo); // fill the system information structurernrn printf ("This computer has a page size of %d.\n", sSysInfo.dwPageSize);rnrn // Calculate the number of pages of memory to request.rnrn NumberOfPages = MEMORY_REQUESTED/sSysInfo.dwPageSize;rn printf ("Requesting %d pages of memory.\n", NumberOfPages);rnrn // Calculate the size of the user PFN array.rnrn PFNArraySize = NumberOfPages * sizeof (ULONG_PTR);rnrn printf ("Requesting a PFN array of %d bytes.\n", PFNArraySize);rnrn aPFNs = (ULONG_PTR *) HeapAlloc (GetProcessHeap (), 0, PFNArraySize);rnrn if (aPFNs == NULL) rn printf ("Failed to allocate on heap.\n");rn return;rn rnrn // Enable the privilege.rnrn if( ! LoggedSetLockPagesPrivilege( GetCurrentProcess(), TRUE ) ) rn return;rn rnrn // Allocate the physical memory.rnrn NumberOfPagesInitial = NumberOfPages;rn bResult = AllocateUserPhysicalPages( GetCurrentProcess(),rn &NumberOfPages,rn aPFNs );rn rn if( bResult != TRUE ) rn rn printf("Cannot allocate physical pages, error %u.\n", GetLastError() );rn return;rn rnrn if( NumberOfPagesInitial != NumberOfPages ) rn rn printf("Allocated only %p pages.\n", NumberOfPages );rn return;rn rnrn // Reserve the virtual memory.rn rn lpMemReserved = VirtualAlloc( NULL,rn MEMORY_REQUESTED,rn MEM_RESERVE | MEM_PHYSICAL,rn PAGE_READWRITE );rnrn if( lpMemReserved == NULL ) rn rn printf("Cannot reserve memory.\n");rn return;rn rnrn // Map the physical memory into the window.rn rn bResult = MapUserPhysicalPages( lpMemReserved,rn NumberOfPages,rn aPFNs );rnrn if( bResult != TRUE ) rn rn printf("MapUserPhysicalPages failed to map, error %u.\n", GetLastError() );rn return;rn rnrn // unmaprn rn bResult = MapUserPhysicalPages( lpMemReserved,rn NumberOfPages,rn NULL );rnrn if( bResult != TRUE ) rn rn printf("MapUserPhysicalPages failed to unmap, error %u.\n", GetLastError() );rn return;rn rnrn // Free the physical pages.rnrn bResult = FreeUserPhysicalPages( GetCurrentProcess(),rn &NumberOfPages,rn aPFNs );rnrn if( bResult != TRUE ) rn rn printf("Cannot free physical pages, error %u.\n", GetLastError() );rn return;rn rnrn // Free virtual memory.rnrn bResult = VirtualFree( lpMemReserved,rn 0,rn MEM_RELEASE );rnrnrn/*****************************************************************rn LoggedSetLockPagesPrivilege: a function to obtain, if possible, orrn release the privilege of locking physical pages.rnrn Inputs:rnrn HANDLE hProcess: Handle for the process for which thern privilege is neededrnrn BOOL bEnable: Enable (TRUE) or disable?rnrn Return value: TRUE indicates success, FALSE failure.rnrn*****************************************************************/rnBOOLrnLoggedSetLockPagesPrivilege ( HANDLE hProcess,rn BOOL bEnable)rnrn struct rn DWORD Count;rn LUID_AND_ATTRIBUTES Privilege [1];rn Info;rnrn HANDLE Token;rn BOOL Result;rnrn // Open the token.rnrn Result = OpenProcessToken ( hProcess,rn TOKEN_ADJUST_PRIVILEGES,rn & Token);rnrn if( Result != TRUE ) rn printf( "Cannot open process token.\n" );rn return FALSE;rn rnrn // Enable or disable?rnrn Info.Count = 1;rn if( bEnable ) rn rn Info.Privilege[0].Attributes = SE_PRIVILEGE_ENABLED;rn rn else rn rn Info.Privilege[0].Attributes = 0;rn rnrn // Get the LUID.rnrn Result = LookupPrivilegeValue ( NULL,rn SE_LOCK_MEMORY_NAME,rn &(Info.Privilege[0].Luid));rnrn if( Result != TRUE ) rn rn printf( "Cannot get privilege value for %s.\n", SE_LOCK_MEMORY_NAME );rn return FALSE;rn rnrn // Adjust the privilege.rnrn Result = AdjustTokenPrivileges ( Token, FALSE,rn (PTOKEN_PRIVILEGES) &Info,rn NULL, NULL, NULL);rnrn // Check the result.rnrn if( Result != TRUE ) rn rn printf ("Cannot adjust token privileges, error %u.\n", GetLastError() );rn return FALSE;rn rn else rn rn if( GetLastError() != ERROR_SUCCESS ) rn rn printf ("Cannot enable SE_LOCK_MEMORY privilege, please check the local policy.\n");rn return FALSE;rn rn rnrn CloseHandle( Token );rnrn return TRUE;rnrnrn可是运行的时候出现如下错误:rnrnerror LNK2019: 无法解析的外部符号 __imp__AdjustTokenPrivileges@24 ,该符号在函数 "int __cdecl LoggedSetLockPagesPrivilege(void *,int)" (?LoggedSetLockPagesPrivilege@@YAHPAXH@Z) 中被引用rnrnerror LNK2019: 无法解析的外部符号 __imp__LookupPrivilegeValueA@12 ,该符号在函数 "int __cdecl LoggedSetLockPagesPrivilege(void *,int)" (?LoggedSetLockPagesPrivilege@@YAHPAXH@Z) 中被引用rnrnerror LNK2019: 无法解析的外部符号 __imp__OpenProcessToken@12 ,该符号在函数 "int __cdecl LoggedSetLockPagesPrivilege(void *,int)" (?LoggedSetLockPagesPrivilege@@YAHPAXH@Z) 中被引用rnrnrn初学vc.net不知道怎么解决?rn 论坛

没有更多推荐了,返回首页