今天又重新整理并配置了一下YCM的configure file,对于头文件引用路径终于仔细查阅了一下文档,关于-sysroot -isysroot -isystem -iquote以及-I做了一个小的归类:

  • -sysroot – 指定当前的系统路径,就相当于是添加了一个路径作为根目录来搜索,比如,若指定-sysroot /usr/local,那么在紧接下来的参数中若有-isystem /include,那么/usr/local/include路径也会被加入到搜索路径中
  • -isysroot – 同-sysroot,唯一区别是-isysroot只添加头文件的搜索路径,而-sysroot会添加头文件及库文件的搜索路径
  • -isystem – 添加系统搜索路径,也就是使用#include <...>的文件的搜索路径
  • -iquote – 添加本地搜索路径,也就是使用#include "..."的文件的搜索路径
  • -I – 添加系统或者本地搜索路径,已经弃用,建议使用-isystem-iquote

详细的参数解释可以参考:GCC官方网站的关于Directory Options的英文文档

使用CMake的最低版本为2.8.4

cmake_minimum_required(VERSION 2.8.4)

指定工程名称为”sample”

project(sample)

使用find_package来查找已经安装到系统中的库

# Boost
find_package(Boost 1.54 REQUIRED regex program_options date_time filesystem system thread)
 
# OpenSSL
find_package(OpenSSL REQUIRED)
 
# Google Protobuf
find_package(Protobuf REQUIRED)

添加C++的编译参数

add_definitions(-std=c++11)

设置编译参数(DEBUG)

set(CMAKE_CXX_FLAGS_DEBUG "-g -O0 -DDEBUG")

./src/*.cpp文件添加到编译列表

file(GLOB SRC "./src/*.cpp")
add_executable(sample ${SRC})

链接额外的库文件(Boost_LIBRARIES是Boost.cmake中预定义的宏,也就是文件最头定义的那些boost文件)。同时,以下的makefile脚本也将链接OpenSSL的库,以及protobuf和mysqlcppconn两个库。

target_link_libraries(sample ${Boost_LIBRARIES} ${OPENSSL_LIBRARIES} protobuf mysqlcppconn)

安装目标文件到[prefix]/bin/目录下,默认的prefix目录是/usr/local/,所以,以下的makefile脚本将会把sample工程的可执行文件安装到/usr/local/bin/目录下。

install(TARGETS sample DESTINATION bin)

以下为安装可执行脚本到[prefix]/sbin/目录下。与TARGETS唯一不同的地方是,安装完成后将会把对应的文件加上可执行属性。

install(PROGRAMS ./hello.sh DESTINATION sbin)

以下为安装文件,并且会在安装文件前先判断该是否存在,若存在则不安装该文件。

file(GLOB config_file “${CMAKE_INSTALL_PREFIX}}/etc/ume/ume-sc.conf")
if(NOT EXISTS ${config_file})
  install(FILES "./ume-sc.conf" DESTINATION etc/ume)
endif()

变量的基本操作

# 定义一个变量
set(variable_name 100)
 
# 取消一个变量的定义
unset(variable_name)
 
# 判断一个变量是否定义
if (DEFINED variable_name)

在指定的目录中查找某个库并链接

find_library(JSONCPP_LIB jsoncpp /opt/local/lib)
target_link_libraries(sample ${JSONCPP_LIB})

在某TARGET完成编译后执行命令,通常可以用来执行测试用例

add_custom_command(TARGET [target_name] POST_BUILD COMMAND [command])

添加指定的生成命令,例如,在编译某工程时使用到了protobuf编译器生成的源文件,于是需要在这里添加该源文件的生成说明,然后当编译需要使用到该文件时将会自动调用该生成步骤将源文件生成出来。注:CMAKE_CURRENT_BINARY_DIR为当前CMake编译目录。

add_custom_command(
  OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/file.cpp
  COMMAND protoc file.proto --cpp_out=${CMAKE_CURRENT_BINARY_DIR}/
  COMMENT "Generating file.c..."
)

在Windows下写程序,可以很方便的使用MiniDumpWriteDump来保存当前程序的堆栈信息,以供调试,而在linux下,事情似乎变得更加容易一些。
1. SSH登录到机器上(或者打开终端),查看当前是否允许产生dump文件,使用命令

ulimit -c

如果返回的结果为0则表示当前的系统不会产生dump文件,使用该命令修改这一数值至无限

ulimit -c unlimited

则会允许系统产生core dump文件
2. 使用GDB调试该core dump文件,使用命令

gdb [bin file] [core file]

3. 打开了GDB后,使用bt来查看当前的堆栈信息,然后使用select命令选择感兴趣的帧,最后使用l命令来显示出源代码(注:使用GCC或者G++编译的时候,需要加上-g参数将调试信息编译至bin文件中)

要在windows系统下编译gnu的编译器,那么得在windows下建立一个linux的环境,比较好的解决办法就是安装cygwin。

1、安装cygwin:在www.cygwin.org下载setup.exe然后保存在硬盘的目录上,然后双击运行。进入到setup程序后选择next将会看到所有的包的目录树,需要安装与g++,autoconf,automake以及zip相关的包(在窗口上部的查找框中输入相应的关键字后安装出所有已经列出来的包)。准备好后还需要选择源,选择一个和自己地区比较近的源后按下一步就是漫长的下载等待时间了。

2、安装好cygwin后点击cygwin的图标,然后顺序安装gcc 4.5.1编译需要的几个库mpc, gmp, mpfr,注意使用

./configure --prefix=/usr

来配置,以保证库文件和头文件都装到/usr/lib, /usr/include目录里

3、最后配置gcc 4.5.1。使用

./configure --prefix=/usr --enable-languages=c,c++

(这里没有编译JAVA和FORTRAN,如果有需要自行加上)配置好后再make && make install,然后继续漫长的等待了。在编译gcc 4.5.1版本时会在中途出现类似resource not found的问题,但是如果再继续make后该问题则不会再遇到,貌似gcc 4.5.1这个版本在编译方面有一些bug。另外如果选择编译JAVA语言的话,也会碰到一些编译问题,在网上可以找到一些文章,有个补丁应该可以解决编译JAVA的问题,不过因为我没用JAVA,所以我干脆跳过。编译完成后,可以使用codeblocks配置使用cygwin gcc来作为首选编译器,要使用c++0x的语法记得打开-std=c++0x的开关

PS:其实安装好cygwin后,进入命令提示符里就可以当作是linux一样来操作,基本上配置和安装带源代码的程序都是先./configure然后make && make install。cygwin里还有git, subversion, apache, ssh, vim等各种好工具可以使用,如果需要配置更新的版本,可以自行在网上下载相应的源代码来安装。