In my previous post, Creating a basic C/C++ Program to Interact with MySQL and MariaDB, I ran into some errors along the way, so I wanted to share those and their resolutions.
1. fatal error C1083: Cannot open include file: ‘mysql.h’: No such file or directory
mysql1.c mysql1.c(2) : fatal error C1083: Cannot open include file: 'mysql.h': No such file or directory
At this point, my cl command was:
cl /I "C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\include" mysql1.c
So I needed to include the directory that contained mysql.h as well. So the above changed to:
cl /I "C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\include" /I "C:\Program Files\MySQL\MySQL Server 5.5\include" mysql1.c
2. error C2061: syntax error : identifier ‘SOCKET’
This was actually a small slew of simple syntax errors. I could tell it wasn’t the code, so I must have left something else out. Here was the full output/error:
mysql1.c c:\..\mysql_com.h(291) : error C2061: syntax error : identifier 'SOCKET' c:\..\mysql_com.h(337) : error C2059: syntax error : '}' c:\..\mysql_com.h(451) : error C2143: syntax error : missing ')' before '*' c:\..\mysql_com.h(451) : error C2143: syntax error : missing '{' before '*' c:\..\mysql_com.h(451) : error C2371: 'Vio' : redefinition; different basic types ... C:\..\mysql.h(374) : error C2143: syntax error : missing ')' before '*' C:\..\mysql.h(374) : error C2143: syntax error : missing '{' before '*' C:\..\mysql.h(374) : error C2059: syntax error : ')' C:\..\mysql.h(375) : error C2143: syntax error : missing ')' before '*' C:\..\mysql.h(375) : error C2143: syntax error : missing '{' before '*' C:\..\mysql.h(375) : fatal error C1003: error count exceeds 100; stopping compilation
This plethora of errors indicates we’re missing the windows.h header file:
To fix, add the following to the program (which is already included in the program I provided), and then see #3 below:
#include <windows.h>
3. fatal error C1083: Cannot open include file: ‘windows.h’: No such file or directory
mysql1.c mysql1.c(2) : fatal error C1083: Cannot open include file: 'windows.h': No such file or directory
Similar to #1, we need to add another include path, the one that contains windows.h. You can search your system for windows.h with:
dir windows.h /s
For me, this returned:
c:\Program Files (x86)\Microsoft SDKs\Windows\v7.0A\Include
So to fix it, I added it with another /I, so my command became:
cl /I "C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\include" /I "C:\Program Files\MySQL\MySQL Server 5.5\include" /I "C:\Program Files (x86)\Microsoft SDKs\Windows\v7.0A\Include" /MD "C:\Program Files\MySQL\MySQL Server 5.5\lib\libmysql.lib" mysql1.c
4. mysql1.obj : error LNK2019: unresolved external symbol _mysql_close@4 referenced in function _main
In fact, there were 4 similar altogether:
mysql1.obj : error LNK2019: unresolved external symbol _mysql_close@4 referenced in function _main mysql1.obj : error LNK2019: unresolved external symbol _mysql_real_connect@32 referenced in function _main mysql1.obj : error LNK2019: unresolved external symbol _mysql_init@4 referenced in function _main mysql1.exe : fatal error LNK1120: 3 unresolved externals
Turns out this indicates some 32-bit and 64-bit mis-matches.
I had forgot that while I’m on a 64-bit machine, and have 64-bit MySQL already installed (I’m using that header file in my include path), the VS Express is 32-bit. So I need to use a 32-bit header (and different include path), which I downloaded and extracted. So my new command became:
cl /I "C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\include" /I "C:\Program Files (x86)\MySQL\mysql-5.5.30-win32\include" /I "C:\Program Files (x86)\Microsoft SDKs\Windows\v7.0A\Include" /MD "C:\Program Files (x86)\MySQL\mysql-5.5.30-win32\lib\libmysql.lib" mysql1.c
5. The program can’t start because libmysql.dll is missing from your computer
mysql1 mysql1.exe - System Error The program can't start because libmysql.dll is missing from your computer. Try reinstalling the program to fix this problem. [OK]
In this case, I just wanted to get it built, so I simply copied libmysql.dll and libmysql.lib to this working directory. As I mentioned in my previous post, there is probably a better fix than this, but this worked quickly for now anyway.
6. error LNK2019: unresolved external symbol __imp__RegCloseKey@4 referenced in function _win_init_registry
Again, in this case, there were several similar unresolved external errors, so let me post them all:
mysqlclient.lib(my_init.obj) : error LNK2019: unresolved external symbol __imp__RegCloseKey@4 referenced in function _win_init_registry mysqlclient.lib(my_init.obj) : error LNK2019: unresolved external symbol __imp__RegEnumValueA@32 referenced in function _win_init_registry mysqlclient.lib(my_init.obj) : error LNK2019: unresolved external symbol __imp__RegOpenKeyExA@20 referenced in function _win_init_registry mysqlclient.lib(common.obj) : error LNK2019: unresolved external symbol __imp__IsValidSid@4 referenced in function ... mysqlclient.lib(common.obj) : error LNK2019: unresolved external symbol __imp__EqualSid@8 referenced in function ... mysqlclient.lib(common.obj) : error LNK2019: unresolved external symbol __imp__LookupAccountNameW@28 referenced in function ... mysqlclient.lib(common.obj) : error LNK2019: unresolved external symbol __imp__GetTokenInformation@20 referenced in function ... mysqlclient.lib(random.obj) : error LNK2019: unresolved external symbol __imp__CryptAcquireContextA@20 referenced in function ... mysqlclient.lib(random.obj) : error LNK2019: unresolved external symbol __imp__CryptReleaseContext@8 referenced in function ... mysqlclient.lib(random.obj) : error LNK2019: unresolved external symbol __imp__CryptGenRandom@12 referenced in function ... mysql1.exe : fatal error LNK1120: 10 unresolved externals
Fix: Switched from static (/MT) compilation to dynamic (/MD) compilation seemed to fix this:
So the command was (note “/MT …\mysqlclient.lib” to “/MD …\libmysql.dll”):
cl /I "C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\include" /I "C:\Program Files (x86)\MySQL\mysql-5.5.30-win32\include" /I "C:\Program Files (x86)\Microsoft SDKs\Windows\v7.0A\Include" /MT "C:\Program Files (x86)\MySQL\mysql-5.5.30-win32\lib\mysqlclient.lib" mysql1.c
And changed it to:
cl /I "C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\include" /I "C:\Program Files (x86)\MySQL\mysql-5.5.30-win32\include" /I "C:\Program Files (x86)\Microsoft SDKs\Windows\v7.0A\Include" /MD "C:\Program Files (x86)\MySQL\mysql-5.5.30-win32\lib\libmysql.lib" mysql1.c
7. cl : Command line warning D9024 : unrecognized source file type ‘C:\…\libmysql.dll’, object file assumed
c:\chris\mysql1> cl /I "C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\include" /I "C:\Program Files (x86)\MySQL\mysql-5.5.30-win32\include" /I "C:\Program Files (x86)\Microsoft SDKs\Windows\v7.0A\Include" /MD "C:\Program Files (x86)\MySQL\mysql-5.5.30-win32\lib\libmysql.dll" mysql1.c Microsoft (R) 32-bit C/C++ Optimizing Compiler Version 16.00.30319.01 for 80x86 Copyright (C) Microsoft Corporation. All rights reserved. cl : Command line warning D9024 : unrecognized source file type 'C:\Program Files (x86)\MySQL\mysql-5.5.30-win32\lib\libmysql.dll', object file assumed mysql1.c Microsoft (R) Incremental Linker Version 10.00.30319.01 Copyright (C) Microsoft Corporation. All rights reserved. /out:libmysql.exe "C:\Program Files (x86)\MySQL\mysql-5.5.30-win32\lib\libmysql.dll" mysql1.obj C:\Program Files (x86)\MySQL\mysql-5.5.30-win32\lib\libmysql.dll : fatal error LNK1107: invalid or corrupt file: cannot read at 0x368
The problem is trying to use the .dll instead of the .lib, so replace libmysql.dll with libmysql.lib.
That’s all for now.
Hope this helps.