mingw工具编译时遇到的问题总结

今天终于把端午写的代码在windows上(mingw)编译过了。过程还是比较艰辛的,这里记录下:

1、cmake查找系统上的boost库,之前直接失败,原因是FindBoost这个文件只支持到最高1.46.0版本,自己编译安装的boost版本是1.46.1。修改了这个文件支持的boost版本之后,能够找到目录了,但是boost thread和boost system都没法找到。解决方法是在cmake文件中添加:

 代码如下 复制代码
if(WIN32)
       set(Boost_USE_STATIC_LIBS ON)
       set(Boost_NO_SYSTEM_PATHS ON)
       set(Boost_USE_STATIC_RUNTIME ON)
endif(WIN32)

之后,让boost去强制寻找静态库(之前编译boost只编译了静态库)

2、boost asio库在windows中链接的时候,需要指定链接win32 socket相关的库。mingw没有vs这样能够根据静态链接库自动去链接它依赖的库,所以在最终链接成可执行程序的时候,会报undefined reference。解决方法在cmake中添加:

 代码如下 复制代码
if(WIN32)
       find_library(MSwsock mswsock)
       target_link_libraries(http_static MSwsock)
       target_link_libraries(http MSwsock)
       find_library(WS2_32 ws2_32)
       target_link_libraries(http_static WS2_32)
       target_link_libraries(http WS2_32)
       ADD_DEFINITIONS(-DBOOST_THREAD_USE_LIB)
endif(WIN32)

这样当编译环境在windows中时,会自动链接mswsock和ws2_32两个库。

3、boost thread库的静态链接。boost thread库在最后链接的时候,也会报有些符号找不到,差了半天原因,是因为boost在试图链接thread库的动态链接库。因为不想让这个程序在其他windows机器上跑要复制dll,解决方法前面已经有了,就是添加ADD_DEFINITIONS(-DBOOST_THREAD_USE_LIB)这个宏定义,强制boost寻找静态链接库。

4、静态链接mingw的gcc和stdc++库。之前编译完的程序,放到其他机器上还是会报有libgcc相关的动态链接库找不到,因为mingw默认是将内置的gcc和c++库做动态链接的。要修改这个,需要在编译的时候给编译器传递-static-libgcc -static-libstdc++这两个参数,在cmake中可以这样修改CMakeLists.txt文件:

 代码如下 复制代码
if(WIN32)
       set(CMAKE_CXX_FLAGS “-static-libgcc -static-libstdc++”)
endif(WIN32)
时间: 2024-08-02 23:30:42

mingw工具编译时遇到的问题总结的相关文章

eclipse-elipse+mingw+opencv3.0.0编译时subdir.mk出错

问题描述 elipse+mingw+opencv3.0.0编译时subdir.mk出错 一build就提示这个,不明白为什么自动生成的subdir.mk会出错,还是说我少了什么. 这是includepath 解决方案 http://blog.csdn.net/yanzi1225627/article/details/17663151

windows 7下mingw+msys编译ffmpeg

  windows 7下mingw+msys编译ffmpeg   1-->下载安装MingW,mingw-get-inst-20120426.exe  http://sourceforge.net/projects/mingw/ 安装路径 默认C:\MinGW .勾选了 <1> C Compiler  <2> C++ Compiler <3>MSYS Basic System <4>MinGW Developer ToolKit 其中 <3>

开源项目:windows下使用MinGW+msys编译ffmpeg

本文参考了网络上的不少文章,但由于版本环境的问题参考文章并不能直接指导编译,本文吸收多方经验,并在自己多次编译实验的基础上写成,欢迎转载,请注名出处.    FFmpeg是在Linux平台下开发的,但它同样可以在其它操作系统环境中编译运行,本文介绍的就是在windows下编译FFmpeg.一 编译准备    您最好新建一个目录专门用来保存以下下载的文件.1 下载 MinGW 和 MSYS    MinGW(Minimalist GNU on Windows):一个可自由使用和自由发布的Windo

windows 下使用 MinGW + msys 编译 ffmpeg

本文参考了网络上的不少文章,但由于版本环境的问题参考文章并不能直接指导编译,本文吸收多方经验,并在自己多次编译实验的基础上写成,欢迎转载,请注名出处.    FFmpeg是在Linux平台下开发的,但它同样可以在其它操作系统环境中编译运行,本文介绍的就是在windows下编译FFmpeg.一 编译准备    您最好新建一个目录专门用来保存以下下载的文件.1 下载 MinGW 和 MSYS    MinGW(Minimalist GNU on Windows):一个可自由使用和自由发布的Windo

编译时MSIL注入--实践Mono Cecil(1)

   紧接上两篇浅谈.NET编译时注入(C#-->IL)和浅谈VS编译自定义编译任务-MSBuild Task(csproject),在第一篇中我们简单研究了c#语法糖和PostSharp的MSIl注入,紧接第二篇中我们介绍了自定义MSBuild编译任务(记得有位老兄发链接用 MSBuild自动发布Silverlight xap ,我想说的我做的是自定义编译任务,不是什么发布,MSBuild本就是一个发布工具).之所以在此前介绍编译Task是因为我讲介绍的就是利用MSBuild和MSILInje

编译时标签(对JSP进行的XSLT预处理)

js|编译 一篇旧文,翻出来回顾一下.BTW,抗议csdn的分类,XML怎能归于.NET之下!! 发信人: HAX(海曦), 信区: WebDevelop 标 题: 发信站: 饮水思源 (2002年02月12日00:10:32 星期二), 站内信件 编译时标签(对JSP进行的XSLT预处理) 原文:http://www.mail-archive.com/taglibs-dev@jakarta.apache.org/msg00390.html From: James Strachan Subjec

实现一个简单的Java编译时注解处理器

简介 Java注解又称Java标注,是Java语言5.0版本开始支持加入源代码的特殊语法元数据.Java语言中的类.方法.变量.参数和包等都可以被标注.Java标注和Javadoc不同,标注有自反性.在编译器生成类文件时,标注可以被嵌入到字节码中,由Java虚拟机执行时获取到标注.根据元注解@Retention指定值的不同,注解可分为SOURCE.CLASS和RUNTIME三种类型.当被声明为SOURCE时,注解仅仅在源码级别被保留,编译时被丢弃:声明为CLASS时,注解会由编译器记录在clas

运行时和编译时元编程—编译时元编程

原文链接    译文链接     译者:JackWang 运行时和编译时元编程 第二部分 2 编译时元编程 Groovy的编译时元编程支持编译时生成代码.这些变换(译者注:原文该专有名词是transformations,译者直译为变换,也许不准确.如果有知道准确翻译的读者恳请不吝赐教,待译者修正)叫做程序的抽象语法树(AST),在Groovy里,我们叫做AST变换.AST变换支持在编译过程中植入钩子,修改抽象语法树之后继续编译生成正常的字节码流.和运行时元编程相比,这种转换可以在类文件的修改可见

关于 Swift 编译时性能优化的一些思考

本文讲的是关于 Swift 编译时性能优化的一些思考, 上周,我读了 @nickoneill 一篇优秀的帖子 Speeding Up Slow Swift Build Times 之后,我发现用一个略不同以往的角度去读Swift代码,并不是很难. 一行之前很简洁的代码,现在却出现了新的问题--它是否应该重构为9行代码来达到更快的编译速度? (nil coalescing 运算符就是一个例子)孰轻孰重?简洁的代码还是对编译器友好的代码? 我觉得,它取决于项目的大小和开发者的想法. 但请等等...