注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

mie

 
 
 

日志

 
 

GCC编译  

2010-08-09 19:00:59|  分类: linux、FreeBSD等 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

        之前使用的是Code::Blocks。这个IDE虽然比较方便,但是,和VC类似,发布版本之后,调试不方便,平台移植也不方便。

        windows平台的调试解决方案是windbg,linux虽然可以使用gdb,但是,linux的发行版本过多,兼容问题比较麻烦,不得不考虑在其他平台上进行源码编译,这就需要Makefile。

        1. cbp2mak

         最初使用的是这个,但是,问题很多,所以放弃。

        2.  cmake

        3.  automake

        这个不错,可以直接做成安装包。但是,由于开始没有使用,现在的源码较多,所以,总是无法试验成功。

http://tech.ccidnet.com/art/741/20090609/1793493_1.html

http://www.ibm.com/developerworks/cn/linux/l-makefile/

 

        最后决定,使用CMake。

 

问题记录:

1. automake的使用流程

执行autoscan

编辑configure.in

aclocal

autoconf

编写Makefile.am

生成Makefile.in

./configure

make

make install

 

遇到的问题:“No rule to make target `common/*/*.cpp`,needed by `*.o`. Stop”

 

2. CMake

使用CMake进行工程管理

http://hz318.blog.163.com/blog/static/89939720078345756794/

 

(1) 找不到某些头文件

检查一下头文件的路径包含是否存在问题

(2)cannot find -lmysql

我链接的是"libmysql.a",不知道它怎么就成了mysql了。

于是,去目录中查找,没有找到"libmysql.a",看来之前都链接错了!但是Codeblocks居然编译通过!改为“libmysql.so”,此问题解决。

(3)cannot find source file "*.cpp"

应该是这个文件不存在。我查了一下,发现之前一直使用了错误的文件名称“* .cpp”,——多加了一个空格,而且一直没有注意到,所以,上面报错。

(4)error 'PRINT_ERROR' was not declared in this scope

 'PRINT_ERROR' 是在另外一个common.h 里面定义的,而且这里已经包含了,但是,还是报错!

原因:程序使用了预编译头,而CMakeLists.txt中却没有加入预编译头的相关设置。

 

多次尝试预编译头失败(参考了OpenCV源码中预编译头的设置),放弃CMake。

 

3. 直接gcc命令编译

(1)提示“cannot find -llibxml2.a”

原因是,我使用了“ -llibxml2.a”,这是错误的!  参考:Linux 静态与动态库创建及使用实例  http://v8ynkq.dev3.webenabled.net/archives/539

没想到的是,lib和.a是自动加上去的,所以,应该是“-lxml2”。

(2)提示“undefined reference to `std::ios_base::Init::~Init()`”

 参考:[c/c++][gcc] undefined reference to 'std::basic_string ...'  http://hi.baidu.com/tdfrank/blog/item/79738df428fcd364ddc474f8.html

加入:-lstdc++

(3)静态连接(-static)时,提示找不到libmysql.a

将libMySQL.so转换为libMySQL.a,参考:http://www.pengliu.org/articles/linux_ar_static_lib.html

ar cq libMySQL.a libMySQL.so

(4)gcc如何编译64位程序?

使用64位版本的gcc,就编译出64位的程序;使用32位版本的gcc,就编译出32位的程序.

 

命令如下:

gcc -Wall -O2 -o bin/ChServer src/Process_Watch.cpp main.cpp -I./include/ -I./ -I/usr/include -I/usr/include/libxml2 -I./common/ -I/usr/include/boost -I/mysql-connector-c/include -I/root/PKG/mysql-connector-c/include -I/root/PKG/stdext/include -lpthread -lxml2 -lrt -lmysql -lstdc++  -L/usr/lib -L/usr/local/lib -L/root/PKG/stdext/lib -L/root/PKG/mysql-connector-c/lib -fexceptions -Winvalid-pch -include stdafx.h

  评论这张
 
阅读(1106)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2016