cmake

本文介绍如何使用 CMake 构建项目,包括设置输出路径、动态库与静态库的生成,以及添加依赖等关键步骤。
cmake_minimum_required(VERSION 2.8)

project(TEST)

message(STATUS " PROJECT_SOURCE_DIR: " ${PROJECT_SOURCE_DIR})
message(STATUS " PROJECT_BINARY_DIR: " ${PROJECT_BINARY_DIR})

set(EXECUTABLE_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/objs)
set(LIBRARY_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/libs)

aux_source_directory("src/kernel" SRC)
aux_source_directory("src/main" SRC)

add_executable(test $(SRC))

aux_source_directory("src/utility" UTILITY_LIB)
add_library(utility_shared SHARED ${UTILITY_LIB})
set(utility_shared PROPERTIES OUTPU_TNAME "utility" VERSION 0.0 SOVERSION 0 )

include_directory(src/core)

set(CMAKE_INSTALL_PREFIX .)
set(INSTALL_DIR install)
install(DIRECTORY doc DESTINATION ${INSTALL_DIR}/doc)

add_definitions(-DENABLE_DEBUG )
add_dependencies(target-name depend-target1 depend-target2)
add_subdirectory()

file(WRITE filename "message to write...")
file(APPEND filename "message to write...")

include // 用来载入CMakeLists.txt 文件
include (file1 [OPTIONAL])
include (module [OPTIONAL])

find_file(<VAR> name1 path1 path2 ...)
find_library(<VAR> name1 path1 path2 ....)
find_path(<VAR> name1 path1 path2 ...)

if(expression)
    # THEN section
    # command
else (expression)
    # command
endif(expression)
// 如果变量不是:空,0,N, NO, OFF, FALSE, NOTFOUND或
<var>_NOTFOUND时,表达式为真。
if (var)
if (NOT var)
if (var1 AND var2)
if(var1 OR var2)
if (EXISTS dir)
if (COMMAND cmd)当给定的cmd 确实是命令并可以调用是为真
if (file1 IS_NEWER_THAN file2)
if (string MATCHES regex)

aux_source_directory(. SRC_LIST)
foreach(F ${SRC_LIST})
    message()
endforeach(F)

foreach(loop_var RANGE total)
endforeach(loop_var)

foreach(loop_var RANGE start stop [step])
endforeach(loop_var)

编译动态库和静态库

动态库

.so后缀的是动态库, 很多系统的库都是动态库, /usr/lib64 下回喊道很多这种的.so, 有的还会带上库的版本号

cmake 设置动态库:
我的文件目录:
├── build
├── CMakeLists.txt
└── src
├── core
│ ├── utility.cpp
│ └── utility.hpp
├── kernel
│ └── kernel_error.hpp
└── main
└── main.cpp
如果要使core文件夹下的utility文件生成一个动态库:
可以CMakeLists.txt 加入:

# 设置生成的lib的路径: 这里用了PROJECT_SOURCE_DIR
set(LIBRARY_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/lib)

# 设置动态库的目录, 当然也可以用
AUX_SOURCE_DIR("src/core" UTILITY_LIB)

# 生成动态库: utility 是动态库的名字,会生成libutility.so
ADD_LIBRARY(utility SHARED ${UTILITY_LIB})

静态库

.a 后缀的是静态库, 用ar 命令打包 .o文件生成的是静态库。

# cmake 的target只能有一个, 所以这里必须先用utility_static, 然后通过set_target_properties改变输出的名字
ADD_LIBRARY(utility_static STATIC ${UTILITY_LIB})
SET_TRAGET_PROPERTIES(utility_static PROPERTIES OUTPUT_NAME "utility")

直接用g++ 编译动态库, 并连接

├── libs
├── objs
└── src
    ├── main
    │   └── main.cpp
    └── utility
        ├── utility.cpp
        └── utility.h

这是大致的目录结构:

  1. 编译生成libutility.so, 放在libs下(这里utility.cpp 用#include
g++ -fPIC -shared src/utility/utility.cpp -I src/utility/ -o libs/libutility.so
  1. 链接在objs下生成main二进制文件
g++ src/main/main.cpp -fPIC -I src/utility -Wl,-rpath=libs/ -Llibs -lutility -o objs/main

注意: ###-Wl,-rpath -L选项指定的是在编译期间库的搜索路径,然而如果是动态库的话,在运行时加载库,此时只会搜索默认库路径。
此时需在编译时加上-Wl,-rpath=后面指定路径。注意这不是两个选项。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值