我正在尝试在不使用CRT的情况下构建C ++程序但是我收到以下链接器错误并且无法在线找到解决方案。我可以通过启用CRT默认lib来修复它们,但这会破坏我的目标。
error LNK2001: unresolved external symbol __imp____acrt_iob_func
error LNK2001: unresolved external symbol __imp____stdio_common_vfprintf
禁用默认lib对我来说是全新的,我想知道这里是否有人遇到过这些错误并找到了解决方案?
答案 0 :(得分:0)
您可能会发现Linkers and Loaders很有趣。要回答您的问题,需要了解目标文件和可执行程序之间的区别。
从最简单的角度来看,C ++并没有在语言中定义I / O.它将它留给库,通常是Windows的默认CRT。任何有用的程序都必须有一些输入并创建一些输出。没有I / O怎么做?
程序通常在操作系统的上下文中运行;这些被称为托管,因为操作系统提供服务并安排它们在机器上运行。专门的嵌入式程序 - 例如,您可以在微波炉上或在汽车中 - 直接在计算机上运行,无需操作系统。这样的嵌入式程序从硬件端口和中断获取输入和输出,并且对默认运行时库中的函数没有任何用处。
如果您对开发嵌入式系统或用其他内容替换CRT感兴趣,那么您可能希望禁用与CRT的链接。但对于该IMO来说,更好的平台是NetBSD。
答案 1 :(得分:0)
所以我通过在VS项目设置中启用默认lib来解决这个问题。
项目 - >属性 - >链接器 - >输入 - >忽略所有默认库 - >设置为NO。
只有必需的lib才会导入您的项目。