前言
VS无法正常编译调试VLC源码,除了MSVC编译器语法方面不完全支持C99和C89,还因为mingw自带函数而VS没有,如gettimeofday,opendir等,导致VS编译VLC源码出现大量的无法解析的外部符号
既然compat项目本身就为了消除平台相关性,所以我们将相关的mingw源码文件,添加到compat工程中。相关的源码文件来源自mingw-w64-crt文件夹
VS编译VLC源码问题记录分析
无法解析的外部符号 ___chkstk_ms
无法解析的外部符号 ___chkstk_ms,函数 _libiconvlist 中引用了该符号 libvlccore
___chkstk_ms在libgcc.a里面定义, 读者可以将___chkstk_ms在msys2的lib目录下搜索,包含此符号的文件会被搜索出来。记录下:__mingw_vsprintf符号在libmingwex.a里面定义
无法解析的外部符号 __imp____iob_func
错误 LNK2019 无法解析的外部符号 __imp___iob,函数 __matherr 中引用了该符号 libvlccore
原因分析
引用的libcurl.lib是在低版本的VS中编译的,编译libcurl.lib的环境中有__imp____iob_func的定义,但在VS2017中被修改了,所以找不到符号
解决方案
将低版本VS中的定义转换成VS2017中的高版本定义,同时为避免重复定义问题,可将此段代码放在某个cpp文件中,如stdafx.cpp。
extern “C” { FILE __iob_func[3] = { *stdin,*stdout,*stderr }; }
无法识别的外部符号 __imp__iob
无法识别的外部符号 __imp__pctype
无法解析的外部符号 __imp____mb_cur_max
无法解析的外部符号 ___divmoddi4
无法解析的外部符号 _fprintf
无法解析的外部符号 __imp____mb_cur_max,函数 _wchar_from_loop_convert 中引用了该符号
原因分析在于VS2015,这些__imp打头的函数已经加了个前缀,mingw想调用这些以前的函数肯定会报错(工程项目中引入了libmingwex.a等静态库)。VS2013则没有这个问题
VS2015为了解决上述问题,需要链接mingw提供对应的crt库libmsvcrt.a
众所周知,VS2015版本以后目前用的是urtbase库,两种不同的运行时库,可能会导致程序运行崩溃,因此,当前的解决方案是:将上述所有的代码链接应用,重新链接到VS版本上,相当于彻底剥离对于mingw环境的依赖
其他插件的一些编译错误
“ConvertFiberToThread”: 找不到标识符
error Code cannot work correctly on this platform as no real 8 bit data type supported!
E0337 链接规范与前面的 "_Getctype"
mingw源码添加
添加dirent.c,gettimeofday.c文件到工程compat项目中
dirent.c定义了_topendir函数,提供了opendir函数的具体实现
gettimeofday.c定义了gettimeofday函数
“__restrict__”: 重定义;不同的基类型
源代码compat\mingw\sys\time.h
gettimeofday函数声明
#ifndef _GETTIMEOFDAY_DEFINED
#define _GETTIMEOFDAY_DEFINED
int __cdecl gettimeofday(struct timeval*__restrict__,
void*__restrict__ /* tzp (unused) */);
#endif
修改为
#ifndef _GETTIMEOFDAY_DEFINED
#define _GETTIMEOFDAY_DEFINED
int __cdecl gettimeofday(struct timeval*p, void*z);
#endif