windows使用thrift c++ 需要编译lib吗

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了windows使用thrift c++ 需要编译lib吗相关的知识,希望对你有一定的参考价值。

FFmpeg在Windows系统下的编译过程,分四步:如下:1.配置编译环境2.下载FFMPEG的代码3.编译,获取FFMPEG库(头文件,lib,和DLL)4.在VC下配置,测试1.配置编译环境1)安装MSys下载文件:  bash-3.1-MSYS-1.0.11-snapshot.tar.bz2  msysCORE-1.0.11-20080826.tar.gz解压msysCORE-1.0.11-20080826.tar.gz,比如解压到X:\msys(以下内容都使用该路径描述,X为你安装的盘符)。  解压bash-3.1-MSYS-1.0.11-snapshot.tar.bz2,产生一个名为bash-3.1的目录,在该目录下有一个子目录名为bin,其他的目录不需要关心。复制bin目录中的所有文件到D:\msys\bin,提示是否要覆盖sh.exe的时候,选择是。  到“D:\msys\postinstall”目录下执行pi.bat,在出现的提示中输入n回车后(这个不搞错了),按任意键退出即可。2)安装MinGW  下载文件:binutils-2.20-1-mingw32-bin.tar.gz(binutils-2.19.1-mingw32-bin.tar.gz)gcc-core-3.4.5-20060117-3.tar.gzgcc-g++-3.4.5-20060117-3.tar.gzw32api-3.13-mingw32-dev.tar.gz mingwrt-3.16-mingw32-dev.tar.gz(mingwrt-3.15.2-mingw32-dev.tar.gz)mingwrt-3.16-mingw32-dll.tar.gz(mingwrt-3.15.2-mingw32-dll.tar.gz)把它们全部解压到X:\msys\mingw。3)修改“msys.bat”  用文本编辑器打开D:\msys\msys.bat,由于打算用MSVC++编译程序,所以需要有.lib文件才能链接到FFmpeg的库,这些.lib文件可以使用微软的工具链中lib命令产生。为此,机器上必须已经安装了微软的VisualStudio或是VisualC++。把下面一行加到msys.bat的最前面,把路径替换成机器上vcvars32.bat实际存在的路径,比如我的在“D:\programfiles\MicrosoftVisualStudio8\VC\bin”,于是就添加:  call"D:\programfiles\MicrosoftVisualStudio8\VC\bin"4)系统整合  复制D:\msys\etc\fstab.sample为X:\msys\etc\fstab,用文本编辑器打开D:\msys\etc\fstab编辑。(需要使用一个支持Unix换行风格的编辑器,比如Notepad++),把下面这行:  D:/mingw/mingw  改为:  D:/msys/mingw/mingw注意:改的这个目录为mingw你所安装的目录,所以按本文来讲是这个目录。如果你安装不目录不同,就要改成你所安装的目录。  完成以上步骤,MSys+MinGW系统就配置完成了。2.下载FFMPEG的代码下载代码的法由两个,一个就是用svn下载下来。我觉得哪怕你知道svn是啥,也不用这个方法,因为太慢了。一个文件一个文件下,最关键SVN对应的地址是国外,都不知道什么才能全部下完。另外一个直接下一个代码的压缩包。a)SVN下载地址为svn://svn.ffmpeg.org/ffmpeg/trunkb)直接压缩包。首先进入这个是ffmpeg的官方主页。在选项FFmpegSVN下,点击fullcheckout或者baresources。这连个链接第一个可以通过SVN更新代码,所以文件要大点,后面那个是纯代码。或许可以直接点击该文件的这个两个链接的一个直接得到。(我用的是baresources的程序)3.编译,获取FFMPEG库(头文件,lib,和DLL)首先通过MSys安装目录下的msys.bat启动MSys,这时会出现一个命令行窗口,它是一个运行着bash的rxvt程序,如下图:这是一个类似Linux的shell并且在Windows上运行,就像是在使用一个真正的Linuxshell。不过使用这个shell时需要注意:  →目录名使用正斜杠来分割,而不是Windows所使用的反斜杠(比如说要写成"D:/ffmpeg"而不是"D:\ffmpeg")。  →盘符(例如"C:\")可以从根目录处访问(像这样"/C/")。  →文件名或目录名中如果带有空格,必须用双引号括起(例如这样"/C/ProgramFiles",带有双引号)。  下面切换到存放FFmpeg源代码的目录(假如你的代码解压之后的路径是D:\ffmpeg),方法是输入:"cd/D/ffmpeg"。  接下来要配置FFmpeg,选择编译时包含的库,这里先输入:  ./configure--enable-shared--disable-static--enable-memalign-hack  --enable-memalign-hack选项是FFmpeg在Windows上编译成功所必须指定的,待配置完成后,将回到命令提示符,看到下图所示的画面:如果没有错误的话,就可以"make"具有基本功能的FFmpeg了,在提示符后输入:make。  编译的过程将持续很长时间。如果一切正常,结束后将返回提示符,并有如下的最后编译结束的输出画面:在提示符后输入:makeinstall。执行完后会生成几个文件下在MSys目录的local文件夹下。4.在VC下配置(这个指如何在VC中调用ffmpeg库),测试VC环境配置:(假如目录为上图所示)方法当然就像其他额外库一样,一种是设置VC全局的Include路径为你E:\msys\local\include,设置VC全局lib路径为E:\msys\local\bin,增加操作系统的一个PathE:\msys\local\bin。另一种就是设置某个工程的lib和Include的路径。增加一个指向上面对应的地址。这个我就不是说的详细,想必玩VC的都知道。首先建一个VC的控制台工程,然后把E:\audio_video\ffmpeg\ffmpeg-0.5\libavcodec\apiexample.c(ffmpeg的存放目录)拷贝到你建的那个工程。然后改名apiexample.cpp。编译。你会发现缺头文件。这个时候你需要将E:\msys\mingw\include(mingw安装目录下的include)的inttypes.h,stdint.h,_mingw.h三个文件拷到D:\msys\include(你ffmpeg库的目录下的include)。编译还是有很多错。1.需要在inttypes.h中#define__restrict____restrict2.如果是longlong错误就改成__int64,(我没有遇到这个错误)3.c->time_base.den=(AVRational)1,25;改成c->time_base.num=1;c->time_base.den=25;//4.最上面的头文件定义如下:#include//注意这个别忘了,不然会出现math模板的一个错误#include#include#includeextern"C"#ifdefHAVE_AV_CONFIG_H#undefHAVE_AV_CONFIG_H#endif#include#include#pragmacomment(lib,"avcodec.lib")#pragmacomment(lib,"avutil.lib")4.1.我的理解是在api-example.cpp头文件中加入第4条的内容,即#include#include#include#ifdefHAVE_AV_CONFIG_H#undefHAVE_AV_CONFIG_H#endif#include"libavformat/avformat.h"//andrew#include"libavcodec/avcodec.h"#include"libavutil/mathematics.h"其中我加了#include"libavformat/avformat.h",如果不加就会报许多错误,意思是有学多变量没有定义。我测试了加或者不加头#include,对编译结果没有影响。5.api-example.cpp中似乎不支持强制类型转换,如samples=malloc(frame_size*2*c->channels);其实是将(void*)型转换成(short*),于是我在malloc的前面增加了(short*)此问题得以解决。即samples=(short*)malloc(frame_size*2*c->channels);6.按照网上高手的指示我在vs2005的工具->选项->VC++目录中,包含文件一栏,加入我的include文件夹,即D:\msys\local\include以上,你就可以在VC++中编译ffmpeg了。但是,配置MSYS太困难,咱给你一个下载地址,是已经配置好的MSYS哦~ 参考技术A 1.从boost pro下载安装boost库,包括源文件和lib库。

2.从libevent官网下载libevent库,只有源文件。

3.从thrift官网,使用svn方式下载thrift库,只有源文件。(千万别用压缩包版本的Release发布包,里面的路径都不对)

4.在thrift库的cpp文件夹里,有libthrift和libthriftnb两个工程,这两个工程都可以直接使用VS2010打开。
其中,libthrift需要链接boost的源文件,引用boost lib库。
而libthriftnb不仅仅需要boost的源文件和boost lib库,还需要引用libevent源文件。
然后就可以编译libthrift和libthriftnb两个工程。

5.在thrift的svn的tutorial目录下,用thrift-0.8.0.exe编译tutorial.thrift和shared.thrift,会得到一堆cpp和h文件。这时,新建一个C++ Console空工程,把这些文件都引入。
期间还需要做一些小修正:
5.1 删除thrift文件里的D语言(因为没有这语言的编译器)
5.2 删除shared的skeleton.cpp(防止与Calculator的skeleton.cpp的main冲突)
5.3 为CalculatorHandler类增加一个getStruct函数实现(防止VS2010报错说不能实例化虚类,getStruct方法的内容为空,返回值和参数,直接复制SharedServiceIf.h里的)

Thrift IPC over 管道传输 (Windows)

【中文标题】Thrift IPC over 管道传输 (Windows)【英文标题】:Thrift IPC over pipes transport (Windows) 【发布时间】:2011-12-29 02:18:48 【问题描述】:

感谢许多贡献者,我一直在关注 Thrift 对 Windows 和 VS 开发的支持。编译器和 C++ 库有 VS 2010 项目,我已经确认它们在 0.8 中运行良好。 http://thrift.apache.org/download/

我的问题是关于在 Thrift 中实现传输层,特别是管道(命名或匿名)。我一直在使用有效的 TCP 传输,但在应用程序都是本地的情况下,它是矫枉过正的,通常会导致其他并发症,例如 Windows 防火墙。我想做的是在 Windows 下添加管道传输支持。

【问题讨论】:

【参考方案1】:

命名管道传输已添加到 Thrift。从 SVN 获取开发代码(当前为 0.8.0-dev)——下载详情请参阅http://thrift.apache.org/download/。假设它不会破坏任何东西,它应该包含在 0.9.0 稳定版本中。

TPipe 传输现在具有对 *NIX 和 Windows 的跨平台支持。它在 Windows 下被实现为命名或匿名管道;在 *NIX 下,它通过利用 TSocket 来使用域套接字。 *NIX 还不支持匿名管道。添加起来应该相对简单,但似乎没有需求。

我还贡献了一个示例项目,应该可以更轻松地开始使用它。 SVN 主干现在在 thrift/contrib/transport-sample

下有这个

【讨论】:

以上是关于windows使用thrift c++ 需要编译lib吗的主要内容,如果未能解决你的问题,请参考以下文章

Thrift IPC over 管道传输 (Windows)

mapkeeper总结

浅谈Thrift内部实现原理

编译 C++ Thrift 代码以连接 Cassandra 会导致以下错误。我们在这里缺少啥?

在 Windows 中编译 Apache Thrift 服务

Thrift C++ 链接器错误(Boost 智能指针)