0
点赞
收藏
分享

微信扫一扫

VS编译VLC源码 compat整合mingw代码

前言

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


举报

相关推荐

0 条评论