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
这是大致的目录结构:
- 编译生成libutility.so, 放在libs下(这里utility.cpp 用#include
g++ -fPIC -shared src/utility/utility.cpp -I src/utility/ -o libs/libutility.so
- 链接在objs下生成main二进制文件
g++ src/main/main.cpp -fPIC -I src/utility -Wl,-rpath=libs/ -Llibs -lutility -o objs/main
注意: ###-Wl,-rpath -L选项指定的是在编译期间库的搜索路径,然而如果是动态库的话,在运行时加载库,此时只会搜索默认库路径。
此时需在编译时加上-Wl,-rpath=后面指定路径。注意这不是两个选项。

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

被折叠的 条评论
为什么被折叠?



