Windows+VS2012环境下编译调试MySQL源码(四)



工程和解决方案生成完毕,现在我们可以在VS2012中打开编译了,双击C:\MySQLSC\bld\MySQL.sln以打开解决方案。




工程好多啊,共128个项目。


解决方案中的默认启动项目是【ALL_Build】,不要修改它。



开始编译之前,我们先做一些准备工作,可以有效地减少编译过程中一些不必要的警告和错误。


用文本编辑程序,如【EditPlus】或【Notepad++】等(注意不要用Word等字处理软件)打开如下文件,另存为Unicode编码:



=============================

重要:

需要修改编码的文件列表

C:\MySQLSC\strings\ctype-czech.c

C:\MySQLSC\strings\ctype-latin1.c

C:\MySQLSC\strings\decimal.c

C:\MySQLSC\mysys\thr_mutex.c

c:\mysqlsc\storage\innobase\include\ut0mem.h

C:\MySQLSC\sql\sql_locale.cc



需要修改编码的文件列表

=============================

注意,有些文件直接用EditPlus打开有问题的时候,可以先以[UTF-8]编码打开,之后再存为[Unicode]编码。




举例如下:










上面列表中的文件都作类似处理。


OK,我们现在选择【Debug】【x64】,按【F7】开始编译。




编译的过程会有些长,耐心等待吧。


编译整体是顺利的,只有一个地方(编译initial_database项目时)出现了错误,错误信息如下:


==================================================

125>------ 已启动生成: 项目: initial_database, 配置: Debug x64 ------
121>     正在创建库 C:/MySQLSC/bld/plugin/semisync/Debug/semisync_slave.lib 和对象 C:/MySQLSC/bld/plugin/semisync/Debug/semisync_slave.exp
125>  Building Custom Rule C:/MySQLSC/sql/CMakeLists.txt
125>  CMake does not need to re-run because C:\MySQLSC\bld\sql\CMakeFiles\generate.stamp is up-to-date.
125>  Generating initdb.dep
120>     正在创建库 C:/MySQLSC/bld/plugin/semisync/Debug/semisync_master.lib 和对象 C:/MySQLSC/bld/plugin/semisync/Debug/semisync_master.exp
121>  semisync_slave.vcxproj -> C:\MySQLSC\bld\plugin\semisync\Debug\semisync_slave.dll
120>  semisync_master.vcxproj -> C:\MySQLSC\bld\plugin\semisync\Debug\semisync_master.dll
124>     正在创建库 C:/MySQLSC/bld/plugin/password_validation/Debug/validate_password.lib 和对象 C:/MySQLSC/bld/plugin/password_validation/Debug/validate_password.exp
124>  validate_password.vcxproj -> C:\MySQLSC\bld\plugin\password_validation\Debug\validate_password.dll
125>  Executing C:/MySQLSC/bld/sql/Debug/mysqld.exe --no-defaults --console --bootstrap --lc-messages-dir=C:/MySQLSC/bld/sql/share --basedir=. --datadir=. --default-storage-engine=MyISAM --default-tmp-storage-engine=MyISAM --loose-skip-ndbcluster --max_allowed_packet=8M --net_buffer_length=16K
125>  
125>  input file bootstrap.sql, current directory C:/MySQLSC/bld/sql/data
125>  
125>  CMake Error at C:/MySQLSC/bld/sql/create_initial_db.cmake:103 (MESSAGE):
125>    Could not create initial database
125>  
125>      
125>     Assertion failed: 0, file ..\..\sql\mysqld.cc, line 4191
125>  
125>    R6010
125>  
125>    - abort() has been called
125>  
125>    14:37:36 UTC - mysqld got exception 0x80000003 ;
125>  
125>    This could be because you hit a bug.  It is also possible that this binary
125>  
125>    or one of the libraries it was linked against is corrupt, improperly built,
125>  
125>    or misconfigured.  This error can also be caused by malfunctioning
125>    hardware.
125>  
125>    We will try our best to scrape up some info that will hopefully help
125>  
125>    diagnose the problem, but since we have already crashed,
125>  
125>    something is definitely wrong and this may fail.
125>  
125>    
125>  
125>    key_buffer_size=0
125>  
125>    read_buffer_size=131072
125>  
125>    max_used_connections=0
125>  
125>    max_threads=151
125>  
125>    thread_count=0
125>  
125>    connection_count=0
125>  
125>    It is possible that mysqld could use up to
125>  
125>    key_buffer_size + (read_buffer_size + sort_buffer_size)*max_threads = 59679
125>    K bytes of memory
125>  
125>    Hope that's ok; if not, decrease some variables in the equation.
125>  
125>    
125>  
125>    Thread pointer: 0x0
125>  
125>    Attempting backtrace.  You can use the following information to find out
125>  
125>    where mysqld died.  If you see no messages after this, something went
125>  
125>    terribly wrong...
125>  
125>    7ff7447ecfd5 mysqld.exe!my_sigabrt_handler()[my_thr_init.c:448]
125>  
125>    7ff744dc94fc mysqld.exe!raise()[winsig.c:593]
125>  
125>    7ff744dd5140 mysqld.exe!abort()[abort.c:82]
125>  
125>    7ff744dc6a9b mysqld.exe!_wassert()[assert.c:355]
125>  
125>    7ff74429cdf3 mysqld.exe!test_lc_time_sz()[mysqld.cc:4191]
125>  
125>    7ff74429d19e mysqld.exe!win_main()[mysqld.cc:4399]
125>  
125>    7ff74429da92 mysqld.exe!mysql_service()[mysqld.cc:4752]
125>  
125>    7ff74429e36f mysqld.exe!mysqld_main()[mysqld.cc:4949]
125>  
125>    7ff74429102f mysqld.exe!main()[main.cc:26]
125>  
125>    7ff744dc111c mysqld.exe!__tmainCRTStartup()[crt0.c:241]
125>  
125>    7ff744dc125e mysqld.exe!mainCRTStartup()[crt0.c:164]
125>  
125>    7ff8310f15cd KERNEL32.DLL!BaseThreadInitThunk()
125>  
125>    7ff831cb43d1 ntdll.dll!RtlUserThreadStart()
125>  
125>    The manual page at http://dev.mysql.com/doc/mysql/en/crashing.html contains
125>  
125>    information that should help you find out what is causing the crash.
125>  
125>  
125>  
125>C:\Program Files (x86)\MSBuild\Microsoft.Cpp\v4.0\V110\Microsoft.CppCommon.targets(172,5): error MSB6006: “cmd.exe”已退出,代码为 1。

=============================================================


这个编译错误的原因非常简单,是由于代码中的一个DEBUG断言引致的(我在上面已经高亮标识出来了),修改也非常简单,在VS2012中定位到sql工程下mysqld.cc文件的4191行


DBUG_ASSERT(0);

改为

DBUG_ASSERT(1);

即可。




再次编译,这回非常OK,没有错误信息了。




下一回,我们就可以运行我们编译出来的MySQL,并试着调试它了。


(待续。。。)



已标记关键词 清除标记
©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页