开发环境
- 编译环境:Win10 1903 X64
- 开发工具:VS2015
- 额外工具:构建OPENSSL还需要Perl
- 所需源码:zlib1211.zip | openssl-1.0.2t.tar.gz | mysql-connector-c-6.1.11-src.zip
1 2 3 | cd C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\ vcvarsall.bat amd64 # 选择架构:x86 amd64 amd64_x86 set PATH=D:\Qt\DevTools\perl\perl\bin;%PATH% # 设置Perl所在路径到环境变量 |
静态编译zlib
1 2 3 | cd D:\test\zlib-1.2.11\ contrib\masmx86\bld_ml32.bat # 32位执行这个 contrib\masmx64\bld_ml64.bat # 64位执行这个 |
最后使用VS2015打开:D:\test\zlib-1.2.11\contrib\vstudio\vc14\zlibvc.sln
生成解决方案后进入:D:\test\zlib-1.2.11\contrib\vstudio\vc14\x64
zlibvc 是动态链接库,zlibstat 是静态链接库。
静态编译openssl
1 2 3 4 5 6 7 8 | cd D:\test\openssl-1.0.2t perl Configure VC-WIN32 –prefix=D:\test\openssl # 32位架构 perl Configure VC-WIN64A –prefix=D:\test\openssl # 64位通用 ms\do_win64a nmake -f ms\nt.mak # nt.mak用于生成静态lib库,ntdll.mak用于生成动态dll库 cd out32 # out32/out32dll 进入静态/动态库生成目录 ..\ms\test # 测试构建情况 nmake -f ms\nt.mak install # 安装到D:\test\openssl |
静态编译MySQL-Connector
1 2 3 4 5 6 7 | cd D:\test\mysql-connector-c-6.1.11-src\ mkdir build & cd build cmake .. -G “Visual Studio 14 2015 Win64″ -DBUILD_SHARED_LIBS=OFF -DCMAKE_BUILD_TYPE=Release -DWITH_SSL=”D:\test\openssl” -DOPENSSL_LIBRARY=”D:\test\openssl\lib\libeay32.lib” -DCRYPTO_LIBRARY=”D:\test\openssl\lib\ssleay32.lib” -DCMAKE_INSTALL_PREFIX=”D:\test\mysql” msbuild LibMySQL.sln # VS打开D:\test\mysql-connector-c-6.1.11-src\build\LibMySQL.sln可以生成Release解决方案 # 找到D:\test\mysql-connector-c-6.1.11-src\build\libmysql\Release\mysqlclient.lib #如果想生成32位的,就把Win64连同前面的空格删除掉 |
测试静态编译的MySQL和OpenSSL项目
在VS2015中如下配置项目属性:
项目属性 –> C/C++ –> 代码生成 –> 运行库 –> MT (D用于动态,T用于静态,带d的是debug模式的)
项目属性 –> VC++ –> 包含目录 -> D:\test\mysql\include;D:\test\openssl\include
项目属性 –> VC++ –> 库目录配置 -> D:\test\mysql\lib;D:\test\openssl\lib
项目属性 –> 链接器 –> 输入 –> 附加依赖项 –> libeay32.lib;ssleay32.lib;mysqlclient.lib
测试例子:
#include <iostream> #include <mysql.h> #include <openssl/bio.h> #include <openssl/ssl.h> #include <openssl/err.h> using namespace std; int main() { cout << "Hello World!" << endl; cout << "Hello!" << endl; SSL_load_error_strings(); ERR_load_BIO_strings(); OpenSSL_add_all_algorithms(); printf("MySQL client version: %s\n", mysql_get_client_info()); system("PAUSE"); return 0; }
其他技巧
- MySQL官方的动静态库
打开你的MySQL安装目录C:\Soft\mysql-5.7.28-winx64\lib\,libmysql.lib和libmysql.dll为动态库,mysqlclient.lib为静态库。
- 检查库文件是动态还是静态库
可以用7zip打开库文件。如果里面内容后缀显示为xxx.dll则为动态库的导入文件,后缀显示为xxx.obj则为VS的静态库。后缀显示为xxx.o则为GCC的静态库。
- 转换VS的.lib/.dll动态库为GCC的.a动态库
1 2 3 | reimp -d libmysql.lib # 生成libmysql.def的老方法,不推荐 pexports libmysql.dll > libmysql.def # 生成libmysql.def的新方法 dlltool -k -D libmysql.dll -d libmysql.def -l libmysql.a # 生成libmysql.a |
原文链接:https://www.exueyuan.top/238.html,转载请注明出处。
请先
!