`

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

阅读更多

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

"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

 

分享到:
评论

相关推荐

    加载桌面提示 C++Runtime Library

    - **定义与作用**:C++运行时库(C++ Runtime Library)是Microsoft为C++编程语言提供的一个库,它包含了运行C++程序所需的各类函数和资源。这些功能涵盖了内存管理、异常处理、输入/输出操作等方面,确保C++编写的...

    Microsoft Visual C++ Runtime Library 32 64

    Microsoft Visual C++ Runtime Library是微软开发的一个重要组件,主要用于支持运行使用Visual C++编译器编译的应用程序。这个库包含了运行时环境所需的各种DLL(动态链接库)和其他支持文件,使得应用程序能够在...

    IBM XL C/C++ for AIX, V11.1 Standard C++ Library Reference

    ### IBM XL C/C++ for AIX, V11.1 Standard C++ Library Reference #### C++ Library Overview 在深入探讨具体细节之前,我们先来简要回顾一下C++标准库的大致概况。C++标准库为开发人员提供了一系列广泛使用的...

    QTP 运行报:Microslft Visual C++ Runtime Library Runtime Error R6025解决方案

    Microsoft Visual C++ Runtime Library Runtime Error! Program: D:\Program Files\HP\QuickTest Professional\bin\QTPro.exe R6025 -pure virtual function call 成功解决QTP10的以上问题!

    调试版本C Runtime Library11.0.51106.1

    C运行时库(C Runtime Library,简称CRT)是Microsoft Visual C++开发环境中不可或缺的一部分,它提供了许多基础功能,如内存分配、输入/输出操作、字符串处理等,支持C和C++程序的运行。调试版本的C运行时库,如...

    Neptune C++ Runtime Library

    "Neptune C++ Runtime Library" 是一个专门为C++开发者设计的运行时库,它提供了许多在开发和执行C++程序时必要的功能和服务。这个库可能是开源项目,可以在SourceForge.net上找到,这是一个知名的开源软件托管平台...

    非调试版本-C Runtime Library11.0.51106.1

    总之,非调试版本的C Runtime Library 11.0.51106.1是Visual C++开发和运行环境的重要组成部分,提供了C++标准库和C语言运行时支持,以及与.NET Framework的集成。了解并正确配置这个库对于开发和维护使用C++编写的...

    Microsoft 2008 C++ Runtime (x86)

    - CRT(C Run-Time Library):C语言运行时库,包括基本的I/O、字符串处理、内存分配等函数。 - OpenMP:一个并行编程模型,用于多处理器和多核心系统的并行化编程。 - PDB文件:Program Database,调试信息文件,...

    Microsoft Visual C++运行库合集包完整版2021年8月版_x86_x64_v52.exe

    Microsoft C Runtime Library (2002: 7.0.9975.0) Microsoft C Runtime Library (2003: 7.10.6119.0) Microsoft Visual C++ Redistributables (x86/x64) Microsoft Visual C++ 2005 Redistributable – 8.0.61187...

    Visual C++ Runtime 2013 x64

    Microsoft Visual C++ 2013运行库(VC2013运行库)x64位版本微软官方中文版下载。Visual C++ 2013可再发行组件包安装...这些软件包安装以下这些库的运行时组件:C 运行时 (CRT)、标准 C++、ATL、MFC、C++ AMP 和 OpenMP。

    【Todd收藏工具】微软常用运行库合集C/C++64位版本 2019.04.24

    Microsoft C Runtime Library(7.0) Microsoft C Runtime Library(7.10) Microsoft Visual C++ 2005 SP1(8.0.61187) Microsoft Visual C++ 2008 SP1(9.0.30729.7523) Microsoft Visual C++ 2010 SP1(10.0.40219.473) ...

    非调试版本-C Runtime Library12.00.21005.1

    非调试版本的C运行时库(C Runtime Library)是微软Visual C++编译器的一个关键组件,主要用于支持C和C++程序的执行。这个版本号12.00.21005.1的库是为Visual Studio 2013设计的,它包含了运行许多基于VC++开发的应用...

    Microsoft Visual C++ 2013 Runtime 64bit 工具(mysql安装需要)

    它是一系列动态链接库(DLLs),包含了执行C++程序所需的基本函数和类,比如标准模板库(STL)、C运行时库(CRT)、MFC(Microsoft Foundation Classes)以及ATL(Active Template Library)。这些库文件提供了内存...

    c++ API中文文档

    C++ API主要包括了标准模板库(Standard Template Library,STL)、C运行时库(C Runtime Library)和C++标准库。STL是C++库的核心部分,它提供了一组高效的容器(如vector、list、set等)、迭代器、算法和函数对象...

    【Todd收藏工具】微软常用运行库合集C/C++ 2019.04.24

    Microsoft C Runtime Library(7.0) Microsoft C Runtime Library(7.10) Microsoft Visual C++ 2005 SP1(8.0.61187) Microsoft Visual C++ 2008 SP1(9.0.30729.7523) Microsoft Visual C++ 2010 SP1(10.0.40219.473) ...

    C/C++一些有用lib库与头文件

    在C/C++编程中,库和头文件是程序员不可或缺的工具,它们提供了各种功能和接口,使得代码编写更加高效和简洁。以下是一些常见的、有用的C/C++库和头文件,以及它们各自的知识点。 1. **标准库(Standard Library)** ...

    Microsoft Visual C++ 2010 Runtime x86

    这个运行时库包含了C++标准库、CRT(C运行时)、MFC(Microsoft Foundation Classes)、ATL(Active Template Library)和其他相关功能的实现,使得开发者可以编写出更高效、更可靠的代码。 **什么是运行时库?** ...

    Visual C++ 运行库合集

    Microsoft C Runtime Library (2002: 7.0.9975.0) Microsoft C Runtime Library (2003: 7.10.6119.0) Microsoft Visual C++ Redistributables (x86/x64) Microsoft Visual C++ 2005 Redistributable – 8.0.61187 ...

    C++ Advanced Runtime Library-开源

    C++ Advanced Runtime Library,简称CARL,是一个专注于提供高级API和易用性的C/C++标准库替代品。作为一个开源项目,它体现了社区驱动的软件开发模式,使得开发者能够共享、学习和改进代码,推动技术的持续发展。...

Global site tag (gtag.js) - Google Analytics