最近在学习一个C语言编写的API,在编译运行源码时发生了大量错误,花了许多时间才解决。记录一下,以便今后参考。
首先,在分析错误类型时要知道,VS中报错代码为Cxxx的是编译期错误,LNKxxx的是链接时的错误。只有编译完全通过后才会开始链接。
1.改变项目x64、x86:
项目右键-属性-配置平台-win32/x64
配置管理器-活动解决方案平台 和 项目平台中改win32/x64
2.编译中缺少头文件:C1083 无法打开包括文件: “xxx.h”: No such file or directory:
这个问题是系统找不到c文件中include的.h头文件造成的解决:
方法一、项目右键-添加-新建项-新建头文件。
方法二、如果是引用的别的库,项目右键-属性-VC++目录-包含目录中,把头文件的路径添加进去。
3.C2011
“xxx”:“struct”类型重定义:
struct类型的xxx变量定义了两次造成的。
查看代码中是否对xxx定义了多次,可能是忘记判断#ifndef造成的,也可能是多个库之间定义的变量名重复了。如pthread.h和time.h中都有“timespec”,就会报错。
对于这样的问题暂时不知道怎么解决比较好,只能提前define条件让其中的一个不要定义。
4. C2065 “lock”: 未声明的标识符 + 未定义标识符 “pthread_mutex_t”:
没有定义”pthread_mutex_t”。或许是忘记include头文件了。
5.LNK2019 无法解析的外部符号 __imp__pthread_mutex_lock,该符号在函数 _esbLog 中被引用:
找不到该变量、函数名。
该类问题通常是没有指定要链接的外库文件或者命名错误造成的。
解决方法:
1.找到相应库的lib文件
2.项目属性-连接器-常规-附加库目录 指定库文件的目录。
3.项目属性-连接器-输入-附加依赖项 添加库文件的名字。
<pthread.h>:pthreadVC2.lib;
<winsock.h>:wsock32.lib;
<openssl/bio.h>:libeay32.lib;ssleay32.lib;
6.C1189
#error: “No Target Architecture”
winnt.h
:
在用到的文件开头写上 #include <windows.h>
7.LNK2019 无法解析的外部符号 main,该符号在函数 “int __cdecl invoke_main(void)” (?invoke_main@@YAHXZ) 中被引用 MSVCRTD.lib(exe_main.obj):
这说明在控制台项目中没有正确定义main入口方法。
8.如何调整项目最终生成的文件(exe,dll,lib):
项目属性-常规-配置类型-选择想要的类型
9.0x000007FEF96C5AD6 (pthreadVC2.dll)处(位于 c.exe 中)引发的异常: 0xC0000005: 读取位置 0x0000000000000008 时发生访问冲突。
调用pthreads-w32库的pthread_mutex_unlock(&lock)时出错。原因是在锁定之前需要对pthread_mutex_t lock 进行初始化。
在加锁前加这句:
pthread_mutex_init(&(lock), NULL);
10.windows下使用pthread
pthread是linux下的线程库。而windows平台下,却并不被支持,而pthreads-w32为我们提供了解决方案。
下载:ftp://sourceware.org/pub/pthreads-win32/pthreads-w32-2-9-1-release.zip
我们用的是“Pre-built.2”下的文件。
将include和lib文件复制到响应文件夹。
并把dll下的x64文件夹下的两个文件,即pthreadGC2.dll与pthreadVC2.dll拷贝到C:\Windows\System32下(用于64位程序的运行)。
再把dll下的x86文件夹下的五个文件,拷贝到C:\Windows\SysWOW64下(用于32位程序的运行)。
参考:http://blog.csdn.net/qianchenglenger/article/details/16907821