我试图构建一个尽可能小的应用程序,在这样做的过程中,我试图通过使用WinAPI调用而不是标准C/C++调用来避免使用CRT。不幸的是,我仍然收到一个链接器错误:Error2errorLNK2001:unresolvedexternalsymbol_memcpy我没有在我的代码中的任何地方调用memcpy,所以我假设Windows函数之一正在调用它。打开内部函数会给出一个未解析的符号_memset,我也不使用它。根据我的理解,memcpy和memset都应该包含在启用的内部函数中。由于我的代码太长无法发布,以下是我程序中的WinAPI调用:lstrcpywsprintfCopyMemor
我最近收到这个警告(VC++2010)警告LNK4210:.CRT部分存在;可能有未处理的静态初始化器或终止器我假设这是临界区。我的操作系统类(class)已经有一段时间了,所以我真的不明白这意味着什么。如果我没记错的话,关键部分使用共享资源。那么这个警告是如何相关的,它究竟意味着什么? 最佳答案 不,CRT=C运行时。它是任何程序完成工作所需的支持库。像strcpy()这样的东西住在那里。当您的代码包含需要在程序开始运行之前初始化的全局变量时,您的.obj文件中会出现一个“.CRT部分”。CRT会负责这一点。这没什么不寻常的。问题
在编写Win32C/C++代码时,使用lstrcpyn或CopyMemory等Windows特定函数代替相应的CRT函数是否有任何优势(例如性能?)(除了CRT功能的可移植性)? 最佳答案 至少一些CRT函数在内部使用Win32函数。此外,CRT需要额外的初始化(例如strtok等函数的线程特定数据)和清理,您可能不希望发生这些事情。你可以创建一个普通的Win32应用程序,而不依赖于任何其他东西,包括CRT(很像你可以使用NTDLL.DLL创建一个普通的NT应用程序-我想想Windows的smss.exe就是这样一个进程BTW)。话
我是C++的新手,但我以前使用过C。用C编写的程序必须与CRT链接(在Windows中,它是文件libcmt.lib),其中包含C函数(例如:printf()).但我想知道,是否存在“C++RT”(与CRT相反)这样的东西,我的意思是C++函数和类在哪里(例如:std::ofstream)存储。我还有一个问题,如果我使用一些C函数(例如:printf()),我的C++程序是否会同时与CRT和“C++RT”链接,还是“C++RT”包含CRT? 最佳答案 这取决于C++standardlibrary的具体实现你正在使用。GCC附带lib
在分发Windows原生应用程序时,我们还需要为vcredist.exe烦恼吗?这些是否与Win-7捆绑在一起?如果不是,是否有任何技术原因,这些没有通过例如Windows更新-而不是让我们用另一件必须工作的东西给客户带来负担?(好吧,这听起来可能有争议,但我真的很想知道为什么这些库没有默认安装/更新在Windows机器上) 最佳答案 我认为这取决于您链接的方式/内容。如果您直接链接到kernel32.dll等,那没关系,当然(即嵌入了c运行时库),但Microsoft不推荐这种分发方法。如果您通过msvcr80/90/whatev
在窗口中;有2个选项可以链接到CRT:多线程,静态链接多线程,动态链接有人可以阐明这里的最佳做法是什么吗?我应该“静态”链接到CRT还是动态链接?如果我做一个动态链接,并且我编写了一个程序,该程序使用我的DLL+另一个第3方DLL(它正在做一个到CRT的静态链接),这是一个问题吗? 最佳答案 当您在应用程序中使用DLL时,这是一件大事。EXE和DLL使用相同的内存分配器是非常重要的。如果您从需要由调用者释放的DLL函数返回指针或C++对象(如std::string)。要获得相同的分配器,所有模块必须使用相同的CRT实例。如果您使用/
当通过LoadLibrary加载外部DLL(不受我们控制)时,我们遇到了一个问题,即这些DLL中的静态链接CRT无法分配光纤本地存储。这类似于mskb193462,除了这是FLS,而且只有128个。有什么有用的方法可以解决这个问题吗?CRT无论如何都在使用GetProcAddress来查找FlsAlloc(因为它在XP中显然不存在),所以它真的需要它吗?(这是在Vista上,FlsAlloc实际存在;DLL似乎正在使用MSVC8) 最佳答案 坦率地说,除了加载更少的dll之外,这里没有解决方案。您可以Hookdll的导入地址表-但那
例如,这个应用程序:#define_WIN32_WINNT0x0500#includeint__stdcallNoCRTMain(void){intresult;PWSTRlpCmdLine=GetCommandLine();for(;;){if(*lpCmdLine==L'"'){lpCmdLine++;for(;;){if(*lpCmdLine==L'"')break;if(*lpCmdLine==L'\0')break;lpCmdLine++;}}if(*lpCmdLine==L'')break;if(*lpCmdLine==L'\0')break;lpCmdLine++;}wh
很抱歉打扰任何人这个问题,但我已经研究了几个小时,还没有解决方案:我正在将一个相当庞大的应用程序移植到VisualStudio2010中的10.0CRT(编译器)。该应用程序是使用/clr的托管C++/CLI。大部分代码是原生的(95%),其中有一些托管部分。所以我的工作是在.vcxproj中进行切换以针对较新的10.0CRT(即编译器)。我们以前使用的是v90,或者使用VS2008SP1附带的VC编译器。好吧,这么重大的变化?实际上看起来像一堆。我修复了一些处理集合的迭代器问题,这一切都非常简单。但是这些链接器错误让我很难受。任何帮助将不胜感激:1>MSVCMRTD.lib(loca
我试图在不使用CRT或在任何情况下除kernel32.lib之外的任何其他导入的情况下构建控制台应用程序。我得到了要编译的代码,但无法将链接器包装在一些问题上:unresolvedexternalsymbol@__security_check_cookie@4unresolvedexternalsymbol"int__cdeclFreeLibrary(void*)"(?FreeLibrary@@YAHPAX@Z)unresolvedexternalsymbol"void*__cdeclLoadLibraryW(wchar_t*)"(?LoadLibraryW@@YAPAXPA_W@Z)