选择正确的C/C++ Runtime Library

2023-11-13

解决下面的编译/链接问题过程中,有一些新的认识。

"warning LNK4049: locally defined symbol"

"error LNK2001: unresolved external symbol"

 

本文意在总结,讨论的中心自然也正如标题所言,是"C/C++ Runtime Library"

如果有副标题的话,我想我会用这些编译器的Warning与Error作为这篇blog的副标题。

 

和我以往的叙事习惯一样,共分为两部分。

第一部分首先描述我遇到的问题的现象,以及我探索的过程。

第二部分给出解决方案以及对这个问题的思考。

最后列出其他输入阅读的资源。

如果你更关心关于问题解得内容,那么请跳过第一部分。

 

 

一、问题现象 & 探索过程

 

1. 背景

公司最近有一个关于安全的项目,打算使用ssl技术,

应为公司以前就曾购买过RSA BSAFE SSL-C 这个库,自然我们的调查工作也就基于此展开。

(关于与他的是是非非,我还有很多话题想说)

 

给出的代码示例是拿"Visual Studio 2008 Command Prompt"的nmake编译的。

而我们的目的是要在工程里面使用他,

于是我们的第一步工作就是要在vc里面配置出个环境,是的我们可以展开针对他的编程工作。

发现的一些列问题,就是我分别在VS 2008和VC++ 6.0这两个IDE中配置sslc的环境而引发的。

 

 

2. 在VS2008中的问题

先说vs2008,导入那个sslc_standard.lib,自然地几步必不可少,

添加头文件库,添加这个lib库以及其他必须的库,定义一些他必须的宏。

(这些东西文档中没有,是我们痛苦的在那个makefile里面读出来的。)

在这些步骤完成后,本以为已经顺利搞定,

可Link的时候他还是出错。(错误信息与vc6的类似在此不错引用)

 

最终我在[Project]  ->  [Linker]  ->  [Input]  ->  [Ignore Specific Library]中

将msvcrt.lib忽略掉问题才算解决。

 

2. 在VC++ 6.0中的问题

虽然有了vs2008的经验,但在vc6的旅途并不轻松。

我把2008的那一套,在vc6重头到尾做一遍,发现仍然不行,错误信息如下:

 

错误信息
Linking...
LINK : warning LNK4049: locally defined symbol "_sprintf" imported
LINK : warning LNK4049: locally defined symbol "_strncmp" imported
LINK : warning LNK4049: locally defined symbol "_fclose" imported
LINK : warning LNK4049: locally defined symbol "_fflush" imported
LINK : warning LNK4049: locally defined symbol "__pctype" imported
LINK : warning LNK4049: locally defined symbol "__isctype" imported
......................
sslc_standard.lib(bss_file.obj) : error LNK2001: unresolved external symbol __imp__fread
sslc_standard.lib(entropy.obj) : error LNK2001: unresolved external symbol __imp__fread
sslc_standard.lib(bss_file.obj) : error LNK2001: unresolved external symbol __imp__fwrite
sslc_standard.lib(bss_file.obj) : error LNK2001: unresolved external symbol __imp__fopen
sslc_standard.lib(entropy.obj) : error LNK2001: unresolved external symbol __imp__fopen
sslc_standard.lib(def_pswd.obj) : error LNK2001: unresolved external symbol __imp__fopen
sslc_standard.lib(bss_file.obj) : error LNK2001: unresolved external symbol __imp___setmode
sslc_standard.lib(bss_file.obj) : error LNK2001: unresolved external symbol __imp__fileno
OLDNAMES.lib(fileno.obi) : error LNK2001: unresolved external symbol __imp__fileno
.......................
sslc_standard.lib(def_pswd.obj) : error LNK2001: unresolved external symbol __imp__getch
OLDNAMES.lib(getch.obi) : error LNK2001: unresolved external symbol __imp__getch
OLDNAMES.lib(fileno.obi) : error LNK2001: unresolved external symbol __imp___fileno
OLDNAMES.lib(stat.obi) : error LNK2001: unresolved external symbol __imp___stat
OLDNAMES.lib(getch.obi) : error LNK2001: unresolved external symbol __imp___getch
Debug/ssl_server.exe : fatal error LNK1120: 20 unresolved externals
Error executing link.exe.

ssl_server.exe - 32 error(s), 15 warning(s)
 

我知道一定是两头的配置有什么地方不一样,

于是我就连diff连头项目的设置带google。

终于发现将下面位置的值从默认的"Debug Single-threaded"改成"Debug Multithreaded DLL"即可。

[Project]  ->  [Setting]  ->  [C++]  ->  [Code Generation]  ->  [Use run-time library]

(VS2008的runtime library的默认值也是Multi-threaded Debug DLL)

 

 

3.和我经历过同样问题的人

 

Qt-interest Archive, May 2001 Linker errors qt 3.0.0-snapshot-20010516

DUMB doesn't work in MSVC

 

现象都是先说一堆:"warning LNK4049: locally defined symbol......"

再说一堆:           "error LNK2001: unresolved external symbol....."

错误的地方都是一堆C标准函数。

 

 

二、总结 & 思考

 

这个问题的根本原因是C/C++ Runtime Library冲突的问题。

 

这个问题我个人本来是打算好好写一写的,但十分不幸的是,

我发现能写的内容都被Choosing the Correct C/C++ Runtime Library 的作者David 给写尽了。

作者没有写的问题也都在他的blog里面设置了到msdn的链接

 

另外,vs2008等后续vc中,已经取消了vc6中Debug Single-threaded的选项。

就其原因,上面的那篇blog中也有讨论。

 

下面是几篇msdn的帖子

Potential Errors Passing CRT Objects Across DLL Boundaries

这一篇讨论了为什么一个程序使用不同的crt可能会引发问题

 

C Run-Time Libraries

这一篇介绍了微软都给我们提供了那些crt.

 

/MD, /ML, /MT, /LD (Use Run-Time Library) 

这一主题共有好几个连接,讨论了不同编译器选项具体会使用那个crt,

下面列举两个,VS.60VS.71

 

 

 

三、其他资源

 

VC6.0链接LIB的问题?

VC初学者经典错误LNK2001详解

VC++的链接错误LNK2001

讨论了其他可能引起LNK2001的原因,包括由编译错误引起的,还有由链接错误引起的。

 

error LNK2001: unresolved external symbol _main

error LNK2001: unresolved external symbol _main解决办法

error LNK2001: unresolved external symbol _main解决办法(zz)

讨论了一些原因的解决办法,包括本文中遇到的crt问题。

 

这三个链接是重复的,之所以列出三个,是我想大家独到这儿的时候,至少有一个会是有效的。

 

其他:

Use /MT[d] or /MD[d]?

有代码事例讨论了CRT,侧重Across DLL Boundary问题。

 

 

四、最后

 

附件是这篇上文提到的blog的pdf版本。

Choosing the Correct C/C++ Runtime Library

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

选择正确的C/C++ Runtime Library 的相关文章

  • 向进度条添加百分比文本 C#

    我有一个方法可以显示进程栏何时正在执行以及何时成功完成 我工作得很好 但我想添加一个百分比 如果完成 则显示 100 如果卡在某个地方 则显示更少 我在网上做了一些研究 但我无法适应我正在寻找的解决方案 这是我的代码 private voi
  • 每个托管线程是否都有自己对应的本机线程?

    我想知道是否在 Net 中创建托管线程 通过调用Thread Start 导致在后台创建一个本机线程 那么托管线程是否有对应的本机线程呢 如果是 当托管线程等待或睡眠时 是否意味着相应的本机线程也在等待或睡眠 是的 NET 线程映射到所有当
  • 未提供参数时如何指定 C# System.Commandline 行为?

    在我的控制台应用程序中 当未提供控制台参数时 将执行我指定列表 在本例中为参数 3 的任何处理程序 调用该处理程序时 布尔参数设置为 false 但对我来说 根本不调用它更有意义 如何防止这种情况发生并显示帮助文本 using System
  • 为什么 int8_t 和用户通过 cin 输入显示奇怪的结果[重复]

    这个问题在这里已经有答案了 一小段代码让我发疯 但希望你能阻止我跳出窗外 看这里 include
  • 如何将非静态类成员“std::bind”绑定到 Win32 回调函数“WNDPROC”?

    我正在尝试将非静态类成员绑定到标准WNDPROC http msdn microsoft com en us library ms633573 aspx功能 我知道我可以通过将类成员设为静态来简单地做到这一点 但是 作为一名 C 11 ST
  • 确保 StreamReader 不会挂起等待数据

    下面的代码读取从 tcp 客户端流读取的所有内容 并且在下一次迭代中它将仅位于 Read 上 我假设正在等待数据 我如何确保它不会在没有任何内容可供读取时返回 我是否必须设置低超时 并在失败时响应异常 或者有更好的办法吗 TcpClient
  • 复制 std::function 的成本有多高?

    While std function是可移动的 但在某些情况下不可能或不方便 复制它会受到重大处罚吗 它是否可能取决于捕获变量的大小 如果它是使用 lambda 表达式创建的 它依赖于实现吗 std function通常被实现为值语义 小缓
  • C中的malloc内存分配方案

    我在 C 中尝试使用 malloc 发现 malloc 在分配了一些内存后浪费了一些空间 下面是我用来测试 malloc 的一段代码 include
  • 复制目录内容

    我想将目录 tmp1 的内容复制到另一个目录 tmp2 tmp1 可能包含文件和其他目录 我想使用C C 复制tmp1的内容 包括模式 如果 tmp1 包含目录树 我想递归复制它们 最简单的解决方案是什么 我找到了一个解决方案来打开目录并读
  • 由 IHttpClientFactory 注入时模拟 HttpClient 处理程序

    我创建了一个自定义库 它会自动为依赖于特定服务的 Polly 策略设置HttpClient 这是使用以下方法完成的IServiceCollection扩展方法和类型化客户端方法 一个简化的例子 public static IHttpClie
  • 在 Visual Studio 2010 中从 Fortran 调用 C++ 函数

    我想从 Fortran 调用 C 函数 为此 我在 Visual Studio 2010 中创建了一个 FORTRAN 项目 之后 我将一个 Cpp 项目添加到该 FORTRAN 项目中 当我要构建程序时出现以下错误 Error 1 unr
  • 从 Linux 内核模块中调用用户空间函数

    我正在编写一个简单的 Linux 字符设备驱动程序 以通过 I O 端口将数据输出到硬件 我有一个执行浮点运算的函数来计算硬件的正确输出 不幸的是 这意味着我需要将此函数保留在用户空间中 因为 Linux 内核不能很好地处理浮点运算 这是设
  • 标准化 UTF-8 到底是什么?

    The 重症监护室项目 http userguide icu project org transforms normalization 现在也有一个PHP库 http us php net manual en class normalize
  • 如何在 32 位或 64 位配置中以编程方式运行任何 CPU .NET 可执行文件?

    我有一个可在 32 位和 64 位处理器上运行的 C 应用程序 我试图枚举给定系统上所有进程的模块 当尝试从 64 位应用程序枚举 32 位进程模块时 这会出现问题 Windows 或 NET 禁止它 我认为如果我可以从应用程序内部重新启动
  • C# HashSet 只读解决方法

    这是示例代码 static class Store private static List
  • 使用管道时,如果子进程数量大于处理器数量,进程是否会被阻塞?

    当子进程数量很大时 我的程序停止运行 我不知道问题是什么 但我猜子进程在运行时以某种方式被阻止 下面是该程序的主要工作流程 void function int process num int i initial variables for
  • 动态添加 ASP.Net 控件

    我有一个存储过程 它根据数据库中存储的记录数返回多行 现在我想有一种方法来创建 div 带有包含该行值的控件的标记 如果从数据库返回 10 行 则 10 div 必须创建标签 我有下面的代码来从数据库中获取结果 但我不知道如何从这里继续 S
  • Cmake 链接共享库:包含库中的头文件时“没有这样的文件或目录”

    我正在学习使用 CMake 构建库 构建库的代码结构如下 include Test hpp ITest hpp interface src Test cpp ITest cpp 在 CMakeLists txt 中 我用来构建库的句子是 f
  • 按 Esc 按键关闭 Ajax Modal 弹出窗口

    我已经使用 Ajax 显示了一个面板弹出窗口 我要做的是当用户按 Esc 键时关闭该窗口 这可能吗 如果有人知道这一点或以前做过这一点 请帮助我 Thanks 通过以下链接 您可以通过按退出按钮轻松关闭窗口 http www codepro
  • 如果没有抽象成员,基类是否应该标记为抽象?

    如果一个类没有抽象成员 可以将其标记为抽象吗 即使没有实际理由直接实例化它 除了单元测试 是的 将不应该实例化的基类显式标记为抽象是合理且有益的 即使在没有抽象方法的情况下也是如此 它强制执行通用准则来使非叶类抽象 它阻止其他程序员创建该类

随机推荐

  • eclipse下maven打包失败(Please ensure you are using JDK 1.4 or above and not ......

    在eclipse下用maven编译时 可能会失败 报出以下提示 ERROR Unable to locate the Javac Compiler in ERROR C Program Files Java jre1 8 0 72 lib
  • 【ABviewer从零开始教学查看器篇①】3D查看器和3D剖面板

    ABViewer是一款高质量 高效率 低成本的多功能设计及工程文档管理工具 能为您提供全面的专业的浏览及编辑功能 同时支持30多种光栅和矢量图形格式 在小编看来 ABViewer是一款非常简单且实用的CAD文档查看与编辑器 对于使用小白可能
  • 华为云计算相关知识点

    云计算离不开网络基础设施 云计算中的网络分为不同的平面 管理平面 负责整个系统的监控 操作维护 系统配置 系统加载 告警上报 和虚拟机管理 创建 删除虚拟机 虚拟机调度 等 存储平面 主要为存储系统提供通信平面 并未虚拟机提供存储资源 用于
  • 你的数据隐私值多少钱?也许已有答案了

    全文共6032字 预计学习时长12分钟 图片来源 Timo Lenzen 对于一些大型科技公司来说 这一年侵犯用户隐私付出的代价变高了 未来还会更高吗 今年7月 脸书在受到有关泄露数亿用户数据隐私的指控后 同意缴纳50亿美元的罚金 同一周内
  • 【TOOLS】Python 3利用SMTP进行邮件Email自主发送

    作者 Che Hongshu 来源 AI蜗牛车 ID AI For Car 一 前言 利用Python进行邮件的发送 这个功能自我感觉主要应用于检测或者报告之类 我两次运用这个功能 第一次用在主要发送实时的数据给一个邮箱 第二次用是检测挂在
  • VS调试:函数断点与数据断点

    断点 是Debug过程中最常用的功能 关于断点VS还有很多高级功能 本文使用的是VS2017 介绍函数断点与数据断点的使用场景以及使用方法 1 普通断点 普通断点是最常接触的断点 VS中 在代码行左边栏灰色区域点击 或者把光标放在某代码行按
  • 使用Python编写Maya脚本插件批量导入Obj文件

    最近开发中遇到需要使用Python语言编写Maya脚本 要求使用脚本选择某一磁盘路径 脚本根据路径自动导入路径与子目录下的所有OBJ文件 并重命名它们 在Maya中 有自带的脚本编辑器供我们使用 这使得我们编写代码非常轻松 打开脚本编辑器
  • Installation did not succeed. The application could not be installed: INSTALL_FAILED_USER_RESTRICTED

    当我们第一次在我们的手机上 也就是物理设备上 运行我们的写好的安卓应用程序时可能会报以下错误 Session app Installation did not succeed The application could not be ins
  • 互斥锁的实现细节

    首先 一个互斥锁要实现什么功能 一个互斥锁需要有阻塞和唤醒功能 实现阻塞和唤醒功能需要哪些要素 需要有一个标记锁状态的state变量 需要记录哪个线程持有了锁 需要有一个队列维护所有的线程 另外 state和队列中为了实现线程安全都用到了C
  • Java - 将base64编码解码成图片

    为了方便测试 我们可以使用一个图片编码网站 将图片进行base64编码 解密的代码如下 public static String generateImage String base64 String path 解密 try String s
  • 计算机视觉(十六):目标检测概述

    1 什么是目标检测 目标检测 Object Detection 的任务是找出图像中所有感兴趣的目标 物体 确定它们的类别和位置 例子 确定某张给定图像中是否存在给定类别 比如人 车 自行车 狗和猫 的目标实例 如果存在 就返回每个目标实例的
  • 配置哨兵监控Redis运行情况

    Redis的主从架构 如果master发现故障了 还得手动将slave切换成master继续服务 手动的方式容易造成失误 导致数据丢失 那Redis有没有一种机制可以在master和slave进行监控 并在master发送故障的时候 能自动
  • 动态链接库(二)--动态链接库的创建

    开发环境 系统 Win10企业版 64位 vs版本 Microsoft Visual Studio 2010 版本10 0 Dll项目创建 为从头了解dll项目中各文件的来源 这里暂不使用vs新建项目列表中的动态链接库 DLL 向导 选择创
  • OJDBC8 12.2.0.1下载

    一 进入oracle官网 注册oracle账户 登入oracle官网 二 在oracle官网找到ojdbc8的下载地址 地址如下 https www oracle com database technologies jdbc ucp 122
  • The Backus-Naur Form (BNF) & The Extended Backus-Naur Form (EBNF)

    The Backus Naur Form BNF The Backus Naur Form BNF is a notation used for formal description of the syntax of programming
  • Web前端学习(四)HTML5语义化标签

    语义化 语义化实际上就是将用一些标签使浏览器能够识别到标签含义 比如什么时候使用标题标签 什么时候使用段落标签 适当的使用这些标签使浏览器能够识别到标签的含义 并作出相应的响应 语义化标签 段落标签 p p p 段落文本 p 新开始一段文字
  • Mac电脑配置李沐深度学习环境[pytorch版本]使用vscode

    文章目录 第一步 M1芯片安装Pytorch环境 安装Miniforge 创建虚拟环境 安装Pytorch 第二步 下载李沐Jupyter文件 第三步 配置vscode 参考 第一步 M1芯片安装Pytorch环境 安装Miniforge
  • [视频学习] 寻根探源话佛教

    根源篇 印度 延續篇 緬甸 穿越興都庫什山脈 延續篇 泰國 05 END 延續篇 中國
  • Windows Server 2012 AD DS环境下域用户自动加入本地管理员组

    刚加入域控 需求 域用户加入域之后 此用户的域账号自动加入本地管理员组 我们的Server2012是一台域控制器 然后再找一台Win 7做客户机 把域用户加入本地管理员组 使用的就是 用户配置首选项中 本地用户和组 用于将登录帐号自动加入本
  • 选择正确的C/C++ Runtime Library

    解决下面的编译 链接问题过程中 有一些新的认识 warning LNK4049 locally defined symbol error LNK2001 unresolved external symbol 本文意在总结 讨论的中心自然也正