由于之前編譯代碼一直用Makefile, 但是新公司都用CMake來(lái)編譯,就花了一天的時(shí)間把Makefile換成CMakeLists.txt. 把學(xué)習(xí)的過(guò)程記錄下來(lái)
先介紹下代碼目錄
.
├── CMakeLists.txt
├── include
│ ├── event.h
│ ├── openssl
├── lib
│ ├── libevent.a
│ └── libssl.a
├── server
│ ├── CMakeLists.txt
│ ├── server.cpp
│ ├── server.h
│ ├── licAuth.conf
├── src
│ ├── CMakeLists.txt
│ ├── src1.cpp
│ ├── src1.h
└── test
├── CMakeLists.txt
├── test1.cpp
└── test2.cpp
- include: 頭文件, gcc/g++的 -I后面跟的就是此目錄
- lib: 靜態(tài)庫(kù), -L 選項(xiàng)后面跟的目錄
- server: server程序,這個(gè)程序要調(diào)用src目錄下的所有代碼產(chǎn)生的靜態(tài)庫(kù), 下面有個(gè)licAuth.conf是默認(rèn)的配置文件,make install的時(shí)候要安裝到/etc/目錄下面
- src: 源文件, 要封裝成靜態(tài)庫(kù)以供別人調(diào)用
- test: 一些測(cè)試程序,測(cè)試src目錄在的代碼
開(kāi)始
在我們寫(xiě)的代碼目錄src, server, test下都新建一個(gè)CMakeLIsts.txt, 根目錄下也要有, 注意不要拼錯(cuò)了,Lists大寫(xiě)的后面跟s.
根目錄下./CMakeLists.txt
cmake_minimum_required (VERSION 2.8) #照抄就行了
project(licAuth) # 隨便起個(gè)名字 然后LicAuth_SOURCE_DIR這個(gè)變量就等于該目錄
add_subdirectory(src) #表示編譯src目錄
add_subdirectory(server) #表示編譯server目錄
add_subdirectory(test) #同上
src目錄./src/CMakeLists.txt
cmake_minimum_required(VERSION 2.8) #照抄
project(lib) #還是隨便起 同時(shí)添加了一個(gè)lib_SOURCE_DIR變量
include_directories(${licAuth_SOURCE_DIR}/include) #添加頭文件目錄 相當(dāng)于 -I
link_directories(${licAuth_SOURCE_DIR}/lib) # 添加靜態(tài)庫(kù)目錄 相當(dāng)于 -L
# 添加一些編譯選項(xiàng), 比如-g之類(lèi)的
add_compile_options(-Wall -std=c++11 -Wunused-variable)
# 下面這兩個(gè)語(yǔ)句代表吧本目錄在的所有源文件打包成一個(gè)靜態(tài)庫(kù) liblic.a
aux_source_directory(. DIR_LIB_SRCS)
add_library (lic ${DIR_LIB_SRCS})
server目錄 ./server/CMakeLists.txt
cmake_minimum_required (VERSION 2.8)
project (server)
# 添加include 和src下的頭文件
include_directories(${licAuth_SOURCE_DIR}/include ${lib_SOURCE_DIR})
# 添加lib和src下生成的靜態(tài)庫(kù)
link_directories(${licAuth_SOURCE_DIR}/lib ${lib_SOURCE_DIR})
#還是編譯選項(xiàng) 自己看著加
add_compile_options(-Wall -std=c++11 -O3 -flto -Wl,--no-as-needed -Wunused-variable)
# 這里就要生成程序了 server是生成目標(biāo),后面跟源文件
add_executable(server server.cpp)
# 這是添加需要的庫(kù), 第一是目標(biāo)后面是需要的庫(kù) -liblic -lssl -lcrypto
target_link_libraries(server lic ssl crypto pthread protobuf event machineid)
#上面這兩句話相當(dāng)與 gcc -o server server.cpp -liblic -lssl -lcrypto
add_executable(client client.cpp)
target_link_libraries(client lic ssl crypto pthread protobuf event machineid)
# make install的配置, 把licAuth.conf 復(fù)制到/etc/目錄
INSTALL(FILES licAuth.conf DESTINATION /etc/)
test目錄下的就跟server目錄差不多了
編譯
編譯的時(shí)候最好新建一個(gè)目錄,在新建的目錄在cmake, 這樣可以很干凈的刪除cmake的中間產(chǎn)物,比如
mkdir build
cd build
cmake ..
make
當(dāng)測(cè)試完畢的時(shí)候 直接把build目錄刪除就好了 或者cmake出錯(cuò)的時(shí)候,也能清空build目錄重來(lái).