VS2015下编译C的常见错误

  • Post author:
  • Post category:其他


最近在学习一个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



版权声明:本文为lu1112原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。