热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

yasmlinuxgcc,vs+msys2+yasm编译libx264+ffmpeg详细解释(32位或64位)

下载msys2下载yasm安装libx264gcc编译libx264(.a.dll)msvc编译libx264(.lib.dll)编译ffmpeg(带libx264)题外话

下载msys2

下载yasm

安装libx264

gcc 编译libx264 (.a .dll)

msvc编译libx264(.lib .dll)

编译ffmpeg(带libx264)

题外话:linux,windows下的各种库的含义

动态链接库(.dll .so)

windows平台(.dll)

linux平台(.so)

静态库(.a .lib)

.a

.lib

内核库(.sys .ko)

下载msys2

1、到这里下载:

http://msys2.github.io. 选择第二个:msys2-x86_64-20160921.exe

下载后,安装默认安装到C:\ msys64

2.安装后,到msys2窗口执行,将C:\msys64\usr\bin加入环境变量。安装编译程序: pacman -S make gcc diffutils

3. 重命名C:\msys64\usr\bin\link.exe 为C: \msys64\usr\bin\link.bak, 避免和MSVC 的link.exe抵触。

4. 下载32位gcc (可以不用做,如果你是想编译.a的32位静态库的话需要这一步)

pacman -Ss gcc 命令搜索,找到mingw32/ 开头的包,这个是32位gcc。

pacman -S mingw-w64-i686-gcc 7.3.0-2 安装32位gcc(具体情况需要看你Ss搜索出来的结构)

注:msys是一个windows下模拟unix系统的工具,里面带有了gcc编译器以及linux下的头文件。pacaman是这个系统的包管理工具。运行msys2_shell.cmd模拟unix终端。通过这个工具,可以编译安装linux系统下的软件包。

下载yasm

YASM下载地址:http://yasm.tortall.net/Download.html,下载其64位版本Win64 .exe (64 位 Windows 通用)。

2、下载后,将下载回来的yasm-1.3.0-win64.exe 改名为yasm.exe,并放置于 MSYS2 安装目录中。就是放置到c:\msys64\usr\bin\ 中。

安装libx264

如果你平时用gcc进行开发的话,需要编译.a的静态库或者.dll的动态库。如果用msvc开发的话需要.lib静态库或者.dll动态库

gcc 编译libx264 (.a .dll)

1.下载libx264源码

git clone git://git.videolan.org/x264.git

2.开一个普通的终端(cmd.exe),转到C:\msys64目录下,运行 msys2_shell.cmd -mingw32 ,关闭旧的cmd.exe,使用新开出来的unix终端

3.转到libx264源码的位置,运行命令

·./configure --disable-cli --enable-shared --disable-win32thread --disable-thread --extra-ldflags=-Wl,--output-def=libx264.def --host=mingw32 --disable-asm --enable-static

–disable-win32thread –disable-thread 是因为windows下msys2有线程包没有弄好,干脆禁用,参考https://blog.csdn.net/jacke121/article/details/80342237

–host 指定编译器,如果编译64位改为mingw64即可

其他的选项百度查一下什么含有

4. make

5. make install

bin inclue lib 会被复制到/usr/local/ 下

6. 通过生成.lib文件

lib /machine:i386 /def:libx264.def

如果想生成64位的.lib,则把/machine去掉,默认64位。注意这个.lib没有任何的内容,它只是提供一个函数的索引,可以在vs工程中使用这个.lib(#pragma comment(lib, "libx264.lib"),编译通过后,程序运行时必须依赖.dll文件。

msvc编译libx264(.lib .dll)

打开x86 Native Tools Command Prompt for VS 2017

63ff5c2bdfa6ab08d63f24ab61a5e608.png

如果想编译出64位的.lib 或者 .dll , 需要打开x64,后面无需改变。

在这个终端下,同样cd到C:/msys2_64, 然后运行msys2_shell.cmd 打开一个新的unix终端,然后使用这个新的终端。

编译

CC=cl ./configure --enable-static --enable-shared

注意CC=cl 意思是指定cl编译器(msvc)

make

make install

生成的文件放在了/usr/local/lib /usr/local/bin /usr/local/include 里面

编译ffmpeg(带libx264)

打开x86 Native Tools Command Prompt for VS 2017

63ff5c2bdfa6ab08d63f24ab61a5e608.png

如果想编译出64位的.lib 或者 .dll , 需要打开x64,后面无需改变。

在这个终端下,同样cd到C:/msys2_64, 然后运行msys2_shell.cmd 打开一个新的unix终端,然后使用这个新的终端。

编译(时间非常长,可能半个小时上)

./configure --toolchain=msvc --enable-yasm --enable-asm --enable-gpl --enable-libx264 --extra-cflags=-I/usr/local/include --extra-ldflags=-LIBPATH:/usr/local/lib --enable-static --enable-shared (这个命令时间相当长,如果顺利的话后面就没什么问题,失败的话检查前面有没有什么问题)

make (半个小时以上)

如果报错:

fftools/cmdutils.c(1119): error C2065: “slib”: 未声明的标识符

fftools/cmdutils.c(1119): error C2296: “%”: 非法,左操作数包含“char [138]”类型

fftools/cmdutils.c(1119): error C2059: 语法错误:“数字上的错误后缀”

fftools/cmdutils.c(1119): error C2059: 语法错误:“%”

fftools/cmdutils.c(1119): error C2017: 非法的转义序列

fftools/cmdutils.c(1119): error C2001: 常量中有换行符

fftools/cmdutils.c(1150): error C2143: 语法错误: 缺少“)”(在“*”的前面)

fftools/cmdutils.c(1150): error C2143: 语法错误: 缺少“{”(在“*”的前面)

fftools/cmdutils.c(1150): error C2059: 语法错误:“)”

fftools/cmdutils.c(1151): error C2054: 在“options”之后应输入“(”

fftools/cmdutils.c(1252): error C2143: 语法错误: 缺少“)”(在“*”的前面)

fftools/cmdutils.c(1252): error C2143: 语法错误: 缺少“{”(在“*”的前面)

fftools/cmdutils.c(1252): error C2059: 语法错误:“)”

fftools/cmdutils.c(1253): error C2054: 在“avclass”之后应输入“(”

fftools/cmdutils.c(1261): error C2275: “AVInputFormat”: 将此类型用作表达式非法

打开ftools/ffprobe.c fftools/cmdutils.c ,搜索CC_IDENT这个宏(这个宏有问题),注释掉

//av_log(NULL, level, "%sbuilt with %s\n", indent, CC_IDENT);

//print_str("compiler_ident", CC_IDENT);

make install

编译出来的文件在/usr/local/bin /usr/local/include /usr/local/lib 直接运用到自己的项目里面去。

题外话:linux,windows下的各种库的含义

动态链接库(.dll .so)

程序运行时才加载的,会加载当前目录的链接库或者系统下的,如windows平台下C:/windows/system32 。

windows平台(.dll)

1.指定.lib文件(函数的索引),只是告诉链接器这个可执行文件需要这个函数,但这个函数现在没有,运行时才去加载。

2.不指定lib文件,通过LoadLibrary加载链接库,在通过GetProcAddress获取函数指针。然后调用时使用函数指针,例如

typedef void (*pMyFunc)(LPVOID);

pMyFunc MyFunc;

HMODULE mydll = LoadLibraryW(L"mydll.dll"); // 加载dll,如果有的话返回非NULL

MyFunc = (pMyFunc)GetProcAddress(mydll, "MyFunc") // 获取dll里面MyFunc这个函数。注意这个函数必须是extern "C" 的,否则函数名不是MyFunc

MyFunc(NULL); //调用函数

linux平台(.so)

linux平台似乎只能用函数加载.so,但加载API不同,具体查百度。

静态库(.a .lib)

.a

这个库指的是Linux平台下的静态库,但windows平台也可以使用(使用mingw编译器或者cygwin等编译器,即windows平台下的gcc),有时候msvc也能够用,得库的编译方法。

静态库其实就是多个.o (.obj) 文件的集合,通过ar命令来打包成一个.a,在程序链接阶段时.a中函数的位置,把需要的函数嵌入到程序中(不需要全部嵌入,用什么嵌入什么)

.lib

windows平台才能用的链接库,分为2中情况,一种是只是提供函数索引的.lib文件(通常体积相当小),需要依赖.dll;一种是和.a类似的链接库,通常体积很大,这种链接库是多个.obj的打包。

内核库(.sys .ko)

.sys 是windows平台下的驱动程序,在x64机器下需要有驱动签名(很贵)才能加载。驱动程序拥有操作系统最高权限,编写驱动程序提供接口供给exe调用,windows平台下部分软件有驱动程序,例如所有的安全软件,大部分网络游戏(防止游戏被篡改),还有我们平常所讲的什么usb驱动,显卡驱动等。

.ko 是linux下的驱动程序,通过insmod加载,详细的我也不懂。



推荐阅读
  • GetWindowLong函数
    今天在看一个代码里头写了GetWindowLong(hwnd,0),我当时就有点费解,靠,上网搜索函数原型说明,死活找不到第 ... [详细]
  • 本文分享了一个关于在C#中使用异步代码的问题,作者在控制台中运行时代码正常工作,但在Windows窗体中却无法正常工作。作者尝试搜索局域网上的主机,但在窗体中计数器没有减少。文章提供了相关的代码和解决思路。 ... [详细]
  • Metasploit攻击渗透实践
    本文介绍了Metasploit攻击渗透实践的内容和要求,包括主动攻击、针对浏览器和客户端的攻击,以及成功应用辅助模块的实践过程。其中涉及使用Hydra在不知道密码的情况下攻击metsploit2靶机获取密码,以及攻击浏览器中的tomcat服务的具体步骤。同时还讲解了爆破密码的方法和设置攻击目标主机的相关参数。 ... [详细]
  • 知识图谱——机器大脑中的知识库
    本文介绍了知识图谱在机器大脑中的应用,以及搜索引擎在知识图谱方面的发展。以谷歌知识图谱为例,说明了知识图谱的智能化特点。通过搜索引擎用户可以获取更加智能化的答案,如搜索关键词"Marie Curie",会得到居里夫人的详细信息以及与之相关的历史人物。知识图谱的出现引起了搜索引擎行业的变革,不仅美国的微软必应,中国的百度、搜狗等搜索引擎公司也纷纷推出了自己的知识图谱。 ... [详细]
  • 本文介绍了在使用Python中的aiohttp模块模拟服务器时出现的连接失败问题,并提供了相应的解决方法。文章中详细说明了出错的代码以及相关的软件版本和环境信息,同时也提到了相关的警告信息和函数的替代方案。通过阅读本文,读者可以了解到如何解决Python连接服务器失败的问题,并对aiohttp模块有更深入的了解。 ... [详细]
  • 本文介绍了在Windows环境下如何配置php+apache环境,包括下载php7和apache2.4、安装vc2015运行时环境、启动php7和apache2.4等步骤。希望对需要搭建php7环境的读者有一定的参考价值。摘要长度为169字。 ... [详细]
  • Java在运行已编译完成的类时,是通过java虚拟机来装载和执行的,java虚拟机通过操作系统命令JAVA_HOMEbinjava–option来启 ... [详细]
  • Introduction(简介)Forbeingapowerfulobject-orientedprogramminglanguage,Cisuseda ... [详细]
  • Answer:Theterm“backslash”isonofthemostincorrectlyusedtermsincomputing.People ... [详细]
  • Nginx使用AWStats日志分析的步骤及注意事项
    本文介绍了在Centos7操作系统上使用Nginx和AWStats进行日志分析的步骤和注意事项。通过AWStats可以统计网站的访问量、IP地址、操作系统、浏览器等信息,并提供精确到每月、每日、每小时的数据。在部署AWStats之前需要确认服务器上已经安装了Perl环境,并进行DNS解析。 ... [详细]
  • Win10下游戏不能全屏的解决方法及兼容游戏列表
    本文介绍了Win10下游戏不能全屏的解决方法,包括修改注册表默认值和查看兼容游戏列表。同时提供了部分已经支持Win10的热门游戏列表,帮助玩家解决游戏不能全屏的问题。 ... [详细]
  • Windows下配置PHP5.6的方法及注意事项
    本文介绍了在Windows系统下配置PHP5.6的步骤及注意事项,包括下载PHP5.6、解压并配置IIS、添加模块映射、测试等。同时提供了一些常见问题的解决方法,如下载缺失的msvcr110.dll文件等。通过本文的指导,读者可以轻松地在Windows系统下配置PHP5.6,并解决一些常见的配置问题。 ... [详细]
  • Whatsthedifferencebetweento_aandto_ary?to_a和to_ary有什么区别? ... [详细]
  • 用户视图(查看运行状态或其他参数)系统视图(配置设备的系统参数)system-viewEntersystemview,returnuservi ... [详细]
  • Apple iPad:过渡设备还是平板电脑?
    I’vebeenagonizingoverwhethertopostaniPadarticle.Applecertainlydon’tneedmorepublicityandthe ... [详细]
author-avatar
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有