链接openssl静态库时遇到的问题(
来源:互联网 发布:南京软件测试薪资 编辑:程序博客网 时间:2024/06/07 07:44
--------------------Configuration: b64 - Win32 Release--------------------
Compiling...
b64.c
Linking...
MSVCRT.lib(MSVCRT.dll) : error LNK2005: __isctype already defined in LIBCMT.lib(isctype.obj)
MSVCRT.lib(MSVCRT.dll) : error LNK2005: _fclose already defined in LIBCMT.lib(fclose.obj)
MSVCRT.lib(MSVCRT.dll) : error LNK2005: __errno already defined in LIBCMT.lib(dosmap.obj)
MSVCRT.lib(MSVCRT.dll) : error LNK2005: _fflush already defined in LIBCMT.lib(fflush.obj)
MSVCRT.lib(MSVCRT.dll) : error LNK2005: _strncpy already defined in LIBCMT.lib(strncpy.obj)
MSVCRT.lib(MSVCRT.dll) : error LNK2005: _strchr already defined in LIBCMT.lib(strchr.obj)
LINK : warning LNK4098: defaultlib "MSVCRT" conflicts with use of other libs; use /NODEFAULTLIB:library
Release/b64.exe : fatal error LNK1169: one or more multiply defined symbols found
Error executing link.exe.
b64.exe - 7 error(s), 1 warning(s)
从错误信息可以看出是msvcrt.lib和libcmt.lib库中重复定义了__isctype等符号。为什么会出现这样的问题呢?这就要从这两个库的作用说起了。
msvcrt.lib是VC中的Multithreaded DLL 版本的C运行时库,而libcmt.lib是Multithreaded的运行时库。在同一个项目中,所有的源文件必须链接相同的C运行时库。如果某一文件用了Multithreaded DLL版本,而其他文件用了Single-Threaded或者Multithreaded版本的库,也就是说用了不同的库,就会导致这个警告的出现。
告警信息的意思我们明白之后,就要找造成这个问题的原因了。在项目设置中我们可以看到当前项目使用的是Multithreaded非DLL版本的运行时库,这说明项目中还有其他文件用到了不是这个版本的运行时库。很显然,就是openssl的静态库。查看openssl中ms下的nt.mak,我们可以发现静态库版本中openssl使用编译开关/MD进行编译的,也就是说openssl静态库是默认用的Multithreaded DLL 版本的C运行时库。
原因找到了。那么解决方法,很明显有两个。总之就是将两个项目的运行时库统一。
- 简单的方式就是将项目的动态库修改为使用Multithreaded DLL 版本的C运行时库即可。
- 某些情况下你的项目可能不能改变当前的运行时库,你可以将openssl的nt.mak中的/MD开关修改为/MT然后重新编译openssl静态库就可以了。
VC中的C运行时库一共有6种,想了解更多信息可以参阅我先前翻译的文章。
Single-threaded (libc.lib)libcmt.lib, msvcrt.lib, libcd.lib, libcmtd.lib, msvcrtd.libMultithreaded (libcmt.lib)libc.lib, msvcrt.lib, libcd.lib, libcmtd.lib, msvcrtd.libMultithreaded using DLL (msvcrt.lib)libc.lib, libcmt.lib, libcd.lib, libcmtd.lib, msvcrtd.libDebug Single-threaded (libcd.lib)libc.lib, libcmt.lib, msvcrt.lib, libcmtd.lib, msvcrtd.libDebug Multithreaded (libcmtd.lib)libc.lib, libcmt.lib, msvcrt.lib, libcd.lib, msvcrtd.libDebug Multithreaded using DLL (msvcrtd.lib)libc.lib, libcmt.lib, msvcrt.lib, libcd.lib, libcmtd.lib- 链接openssl静态库时遇到的问题
- 链接openssl静态库时遇到的问题(
- Openssl 库的静态链接
- 调用静态链接库时遇到的问题
- MySQL 使用静态链接库遇到的问题
- 关于openssl库的链接问题
- 在Windows下用MinGW编译OpenSSL,及OpenSSL静态链接库libcrypto.a使用问题
- 链接静态库的问题
- 静态库遇到的问题
- 在Linux动态库Project中链接静态库时,遇到error adding symbols: Bad value的问题
- 关于linux文件下库的链接问题 openssl pcre
- Linux下动态链接库调用时遇到的问题
- matlab创建动态链接库时遇到的两个问题
- VS2010 创建动态链接库时遇到的问题
- hadoop编译C++的openssl链接问题
- linux动态链接库遇到的问题
- Java链接MySQL时遇到的问题
- kermit使用中遇到openssl的问题
- What is Augmented Reality(AR)
- redis 之网络模型
- UML类图详解
- Python连接mysql
- 调用第三方获取两点坐标距离
- 链接openssl静态库时遇到的问题(
- 对称多处理SMP
- Java正则表达式入门
- iOS 静态类库项目的建立与使用
- javascript == 判断老是出错
- LeapFTP使用教程
- XML序列化
- 一头驴的职场故事
- A* 算法搜索最短路径