在 Windows 平台上调用动态链接库 dll 文件时,有两种方式:
a) 隐式的加载时链接;使用 *.lib (导入库)文件,在 IDE 的链接器相关设置中加入导入库 lib 文件的名称,或在程序中加入预编译指令 #pragma comment (lib,”*.lib”)。
b) 显式的运行时链接。不使用 *.lib (导入库)文件,使用 Load Library(),GetProcAddress() 函数来加载动态库中的函数。
要注意的是在导入库 lib 文件内部包含了其对应 dll 文件的名称,如果使用 16 进制编辑器(如 WinHex)打开导入库的 lib 文件,可以看到对应的 dll 文件名。

在 Windows 平台上,用微软 Visual Studio 中的 C 编译器生成 OpenSSL 的动态库,产生的文件在 out32dll 目录下,有四个文件,默认名称分别为:libeay32.lib,libeay32.dll,ssleay32.lib,ssleay32.dll。这里以 lib 为后缀的是同名 dll 对应的导入库文件,不是静态库文件。
    即使编译出的库文件是 64 位的,默认文件名也是如此,如果我们希望生成的库文件取其他名称,比如希望64位的库文件名称依次为:libeay_x64.lib,libeay_x64.dll,ssleay_x64.lib,ssleay_x64.dll,直接修改文件名称仅在显式的运行时链接动态库时可行,但如果使用隐式的加载时链接方式加载动态库,只简单改名是不行的。此时如果只简单改名,在编译时可以通过,但是在运行时,尽管在可执行目录下已经存在libeay_x64.dll或ssleay_x64.dll,还是会报告错误:
“无法启动此程序,因为计算机中丢失 libeay32.dll(或 ssleay32.dll)。尝试重新安装该程序以解决此问题。”

说明运行时还是要去找改名前的文件,而不会去找改名后的文件。原因在就于虽然已将导入库 libeay32.lib,ssleay32.lib 的名字修改为 libeay_x64.lib,ssleay_x64.lib,但是在这两个文件的内部对应 dll 文件名还是 libeay32.dll 和 ssleay32.dll。如果用16进制编辑器打开这两个导入库文件,能够看到其内部还存在很多ASCII码值为libeay32.dll,ssleay32.dll的字符串。

要想修改 OpenSSL 默认编译出的动态库文件名称,必须在编译动态库时执行一些特殊的操作。对于编译 OpenSSL,可以参考http://blog.csdn.net/henter/article/details/8364532,下面主要介绍如何改变编译出的动态库文件名。
1)假定希望编译出的 32 位 OpenSSL 动态库文件名称分别为 libeay_x86.lib,libeay_x86.dll,ssleay_x86.lib,ssleay_x86.dll,操作如下:

1.1) 在 OpenSSL 的源代码所在目录下,用文本编辑器(比如 Notepad++)打开 Configure 文件,搜索字符串 libeay32(不区分大小写),大概位置在第 1978、1979 行,可以找到如下内容:
#if defined(CRYPTO)
     VALUE "InternalName", "libeay32\\0"
     VALUE "OriginalFilename", "libeay32.dll\\0"
将其中所有的 libeay32 字符串替换为 libeay_x86

紧随其后的行中有如下内容:
#elif defined(SSL)
     VALUE "InternalName", "ssleay32\\0"
     VALUE "OriginalFilename", "ssleay32.dll\\0"
将其中所有的ssleay32字符串替换为 ssleay_x86

1.2)执行命令
perl Configure VC-WIN32 no-asm
ms\do_ms

1.3)进入 ms 目录,用文本编辑器修改文件 libeay32.def,找到下面的行:
LIBRARY         LIBEAY32
将这一行改为:
LIBRARY         LIBEAY_X86

用文本编辑器修改文件 ssleay32.def,找到下面的行:
LIBRARY         SSLEAY32
将这一行改为:
LIBRARY         SSLEAY_X86

用文本编辑器修改文件 ntdll.mak,找到下面三行:
E_EXE=openssl
SSL=ssleay32
CRYPTO=libeay32
修改为:
E_EXE=openssl
SSL=ssleay_x86
CRYPTO=libeay_x86
注意第一行不用修改,改的是第二、第三行。

1.4)执行命令
nmake -f ms\ntdll.mak
这样生成的动态库文件名就是期望的名字,不是OpenSSL 默认的文件名。

-----------------------------------------------------------------------------
2)如果希望编译出的 64 位 OpenSSL 动态库文件名称分别为 libeay_x64.lib,libeay_x64.dll,ssleay_x64.lib,ssleay_x64.dll,操作如下:

2.1)在 OpenSSL 的源代码所在目录下,用文本编辑器打开 Configure 文件,搜索字符串 libeay32(不区分大小写),大概位置在第 1978、1979 行找到如下内容:
#if defined(CRYPTO)
     VALUE "InternalName", "libeay32\\0"
     VALUE "OriginalFilename", "libeay32.dll\\0"
将其中所有的libeay32字符串替换为libeay_x64

紧随其后的行中有如下内容:
#elif defined(SSL)
     VALUE "InternalName", "ssleay32\\0"
     VALUE "OriginalFilename", "ssleay32.dll\\0"
将其中所有的ssleay32字符串替换为ssleay_x64

2.2)执行命令
perl Configure VC-WIN64A
ms\do_win64a

2.3)进入 ms 目录,用文本编辑器修改文件 libeay32.def,找到下面的行:
LIBRARY         LIBEAY32
将这一行改为:
LIBRARY         LIBEAY_X64

用文本编辑器修改文件 ssleay32.def,找到下面的行:
LIBRARY         SSLEAY32
将这一行改为:
LIBRARY         SSLEAY_X64

用文本编辑器修改文件 ntdll.mak,找到下面三行:
E_EXE=openssl
SSL=ssleay32
CRYPTO=libeay32
修改为:
E_EXE=openssl
SSL=ssleay_x64
CRYPTO=libeay_x64
注意第一行不用修改,改的是第二、第三行。

2.4)执行命令
nmake -f ms\ntdll.mak
这样生成的动态库文件名就是期望的名字,不是OpenSSL 默认的文件名。

-----------------------------------------------------------------------------
    在 64 位 Win7 上编译,使用 Visual Studio 2010,执行命令 nmake -f ms\ntdll.mak 时不管是编译 32 位库文件还是 64 位库文件,都曾遇到如下错误:
LINK : fatal error LNK1123: 转换到 COFF 期间失败: 文件无效或损坏

解决方法是:
    在计算机中搜索 cvtres.exe 文件,在目录 \Windows\Microsoft.NET\Framework 和 \Microsoft Visual Studio 10.0\VC 下都能找到32位的文件cvtres.exe,发现 \Microsoft Visual Studio 10.0\VC 下文件版本较老,将其改名或删除。
    在目录 \Windows\Microsoft.NET\Framework64 和 \Microsoft Visual Studio 10.0\VC\bin 下都能找到64位的文件cvtres.exe,发现 \Microsoft Visual Studio 10.0\VC\bin 下文件版本较老,将其改名或删除。
    之后执行 nmake -f ms\ntdll.mak 时就不会报告“转换到 COFF 期间失败: 文件无效或损坏”的错误了。

http://blog.csdn.net/henter/article/details/39576419

修改OpenSSL默认编译出的动态库文件名称的更多相关文章

  1. Makefile 编译动态库文件及链接动态库

    本文为原创文章,转载请指明该文链接 文件目录结构如下 dynamiclibapp.c Makefile comm/inc/apue.h comm/errorhandle.c dynamiclib/Ma ...

  2. Linux下编译tinyxml生成动态库

    首先去到sourceforge下载tinyxml的源码,https://sourceforge.net/projects/tinyxml/?source=dlp,最新版本是2.6.2. 将下载成功的t ...

  3. gcc编译工具生成动态库和静态库之一----介绍

     1.库的分类 根据链接时期的不同,库又有静态库和动态库之分. 静态库是在链接阶段被链接的(好像是废话,但事实就是这样),所以生成的可执行文件就不受库的影响了,即使库被删除了,程序依然可以成功运行. ...

  4. gcc编译工具生成动态库和静态库

    一. 库的分类 1.1. 静态库(.a) 1.1.1. 静态库的代码在编译过程中已经被载入可执行程序,因此体积比较大.所以生成的可执行文件就不受库的影响了,即使库被删除了,程序依然可以成功运行. 1. ...

  5. C++---初识《通过g++ / makefile 编译和调用动态库so文件》(ubuntu)

    C++---初识<通过g++ / makefile  编译和调用动态库so文件>(ubuntu) ------------------------目录------------------- ...

  6. java调用dll或so动态库文件(c++/c)

    java调用dll或so动态库文件(c++/c) 博客分类:  工作 CC#C++JavaEclipse  java调用dll或so动态库文件(c++/c)开发平台:Eclipse3.3.1.1+CD ...

  7. 【转】VS2013动态库文件的创建及其使用详解

    一.VS2013动态库文件的创建 1.新建项目,win32,win32项目,输入项目名称,例如MakeDll. 2.”确定“——”下一步“,选择”DLL“选项,再点”完成“: 3.菜单栏选择”项目“— ...

  8. 从零开始编写动态库文件Makefile,C++版

    这篇文章前,假设你已经看过<跟我一起写Makefile(一)>,陈皓写的那个. 对现有的一个C++动态库文件和调用程序,分别编写Makefile文件,从零开始,花了四天时间才搞清楚一半,生 ...

  9. iOS 获取真机上系统动态库文件

    iOS 获取真机上所有系统库文件 系统动态库文件存放真机地址(/System/Library/Caches/com.apple.dyld/dyld_shared_cache_arm64) 在Mac\i ...

随机推荐

  1. mysql里的sql函数

    仅作为自己忘记时的查询 时间 now() 返回当前年-月-日 时:分:秒格式的时间 UNIX_TIMESTAMP() 当前的uninx时间戳 date_format(date,格式) date是年月日 ...

  2. Qt见解:Post 与 Get 的区别(Get将参数直接与网址整合为一个整体,而Post则将其拆为两个部分)

    第一次接触Qt的Http项目,今天看了一下Post和Get的基本使用方法,就开始尝试了.原先以为Post专门用于向服务器发送请求,然后接收服务器应答的: 而Get只是单纯从服务器获取资源,比如下载这个 ...

  3. c++ 实现将数字转换为中文数字输出

    实现如下函数: void printInChinese(int num); 这个函数输入一个小于100000000(一亿)的正整数,并在屏幕上打印这个数字的中文写法. 例如: 17 -> 一十七 ...

  4. Swift - 1 (常量、变量、字符串、数组、字典、元组、循环、枚举、函数)

    Swift 中导入类库使用import,不再使用<>,导入自定义不再使用"" import Foundation 1> 声明变量和常量 在Swift中使用 &qu ...

  5. 小猪猪逆袭成博士之C++基础篇(三)字符串

    小猪猪逆袭成博士之C++基础篇(三)字符串 String 写在题外的话: 非常感谢在我发了第一篇随笔以后有很多人看还评论了,这大概就是一种笔记性质的,也不一定全对,如果不对的地方请指出来让我加以改正. ...

  6. VIM: 解决vi/vim中粘贴时行首出现很多缩进和空格的问题

    解决vi/vim中粘贴时行首出现很多缩进和空格的问题 http://www.jbxue.com/LINUXjishu/12232.html 由于在secureCRT中会将原来的文本原封不动的按照字符串 ...

  7. [Swust OJ 648]--简单字典(数位dp)

    题目链接:http://acm.swust.edu.cn/problem/0648/ Time limit(ms): 1000 Memory limit(kb): 65535   有这样一本字典,它每 ...

  8. BZOJ 1269: [AHOI2006]文本编辑器editor( splay )

    splay..( BZOJ 1507 题目基本相同..双倍经验 ) ------------------------------------------------------------------ ...

  9. Centos6.5快速配置可用网卡

    原文链接: Centos6.5快速配置可用网卡 安装完成后,我们启动我们的系统,此时我们的系统,是没有连网的,IP设备,并没有被激活,如果我们使用ifconfig命令查看IP地址,就会发现,此刻的地址 ...

  10. Hadoop集群的安装与配置(centos 6.5)

    一.Hadoop搭建准备(centOs6.5  且每个系统都要有同一个用户,如:hadoop)     1.IP的配置 包括Master和Slaves的IP配置,之间能够相互ping通:  例如:   ...