我们在Windows机器上编译和调试C/C++程序时可以使用Visual Studio,在Linux机器上编译 C/C++程序时最终使用的是 gcc/g++,当然,在调试时使用gdb。我们一般使用makefile文件组织大型C/C++或者含有多个C/C++文件的项目,有人认为makefile不太方便,于是发明了CMake。CMake将含有CMake指令的文件生成makefile文件,含有CMake指令的文件的名称一般是CMakeLists.txt,使用CMake是在实际开发中组织和管理C/C++项目的常用方式,也适用于大多数C/C++开源项目。
对 Linux 下的一些 C/C++开源项目,执行 configure 命令后一般会生成CMakeLists.txt文件,接着执行CMake命令会生成makefile文件,然后执行make命令利用gcc/g++对项目进行编译。
CMakeLists.txt的样例如下。
样例一:
cmake_minimum_required(VERSION 2.6)
project (FLAMGINGO_SERVER)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++0x -g -Wall -o0
-Wno-unused-variable -pthread")
link_directories(
${PROJECT_SOURCE_DIR}/lib
/usr/lib64/mysql/
)
set(net_srcs
base/AsyncLog.cpp
base/ConfigFileReader.cpp
base/Platform.cpp
net/Acceptor.cpp
net/ByteBuffer.cpp
net/Channel.cpp
)
set(mysglapi_srcs
mysqlapi/DatabaseMysql.cpp
mysqlapi/Field.cpp
mysglapi/QueryResult.cpp
)
set(chatserver_srcs
chatserversrc/main.cpp
chatserversrc/ChatServer.cpp
chatserversrc/ChatSession.cpp
)
set(fileserver_srcs
fileserversrc/main.cpp
fileserversrc/FileServer.cpp
fileserversrc/FileSession.cpp
)
set(imgserver_sres
imgserversrc/main.cpp
fileserversrc/FileServer.cpp
fileserversrc/FileSession.cpp
)
add_executable(chatserver ${net_srcs} ${chatserver_srcs} ${mysqlapi_srcs})
#只包含库目录是没用的,还必须使用TARGET LINK LIBRARIES 链接该库
TARGET_LINK_LIBRARIES(chatserver mysqlclient)
add_executable(fileserver ${net_srcs} ${fileserver srcs})
TARGET_LINK_LIBRARIES(fileserver)
add_executable(imgserver ${net_srcs} ${imgserver srcs})
TARGET_LINK_LIBRARIES (imgserver)
样例二:
PROJECT(TRADE)
AUX_SOURCE_DIRECTORY(./ SRC_LIST)
SET(EXECUTABLE_OUTPUT_PATH ../bin)
ADD_DEFINITIONS(-g -00 -W -Wall -D_REENTRANT -D_FILE_OFFSET_BITS=64 -DAC_HAS_INFO
-DAC_HAS_WARNING -DAC_HAS-ERROR -DAC_HAS_CRITICAL -DTIXML_USE_STL
-DHAVE_CXX_STDHEADERS -Wno-deprecated ${CMAKE_CXX_FLAGS})
INCLUDE_DIRECTORIES(
./
/usr/local/include/commonlib/json2
/usr/local/include/commonlib/mysql
)
LINK_DIRECTORIES(
./
/usr/local/lib/commonlib
)
ADD_EXECUTABLE(trade ${SRC_LIST})
TARGET_LINK_LIBRARIES(trade pthread netutil json2 mysqlclient dbapi )
注:
(1)首行的 cmake_minimum_required 指令指定支持该 CMakeLists.txt 文件的CMake最低版本号。
(2)project 指令指定该项目的名称,注意,项目名称不是最终生成的二进制程序名,在一个项目下面可以生成多个二进制程序名。
(3)set定义和设置各种变量,set括号后的第1个名称是定义的变量名称,其后是变量的值,例如上述文件定义了CMAKE_CXX_FLAGS、net_srcs、mysqlapi_src、chatserver_srcs、fileserver_srcs、imgserver_srcs共6个变量,之后可以使用${变量名}引用这些变量。这些变量可以是内置的变量,例如CMAKE_CXX_FLAGS指定g++编译选项,EXECUTABLE_OUTPUT_PATH 指定输出的二进制文件路径,也可以是自定义变量如 chatserver_srcs、fileserver_srcs等。
(4)CMake使用aux_source_directory指令指定源码目录,使用include_directories指令指定include目录,使用link_directories指定lib目录。
(5)CMake使用指令指定生成的动态库或静态库的名称.
add_library(libname [SHARED|STATIC|MODULE] [EXCLUDE_FROM_ALL] sourcel source2 ... sourceN)
add_library(hello hello1.cpp hello2.cpp)
类型有如下三种。
◎ SHARED:动态库(扩展名为.so)。
◎ STATIC:静态库(扩展名为.a)。
◎ MODULE:在使用dyld的系统中有效,若不支持dyld,则被当作SHARED对待。
EXCLUDE_FROM_ALL参数的意思是这个库不会被默认构建,除非有其他组件依赖或者手工构建。
(6)TARGET_LINK_LIBRARIES指定生成的二进制文件依赖的其他库。
编写完CMakeLists.txt文件后,进入CMakeLists.txt文件所在的目录,依次执行如下命令即可生成最终的二进制文件:
#利用cmake生成makefile
cmake.
#执行make命令,利用gcc/g++编译生成最终的二进制文件
make