基本结构
cmake_minimum_required(VERSION 3.0)
project(DEMO)
add_executable(run main.cpp)
添加头文件目录
目录结构:
+root
+build
+lib
+heads
-func.hpp
+src
-func.cpp
-main.cpp
-CMakeLists.txt
下文所有的cmake操作都默认在build目录下执行
main.cpp
中调用func
中的函数。CMakeLists中需要加入头文件的查找目录,
cmake_minimum_required(VERSION 3.0)
project(DEMO)
include_directories(./heads)
add_executable(run main.cpp src/demo.cpp)
添加链接库
-
添加系统中的库
如添加OpenCV库
cmake_minimum_required(VERSION 3.0)
project(DEMO)
# find_package命令会自动在系统默认lib路径下寻找所需库。
# 若该库不在系统默认路径下,或者要自定义路径,需要set一下路径
# set(OpenCV_DIR /you/path/to/OpenCVConfig.cmake)
find_package(OpenCV REQUIRED)
add_executable(run main.cpp)
target_link_libraries(run ${OpenCV_LIBS})
-
添加自定义库
比如先把
func
代码编译成动态链接库,再在main.cpp
中调用
cmake_minimum_required(VERSION 3.0)
project(DEMO)
# 可以指定.so文件的输出目录;否则默认为执行make操作的目录
# 注意这里的path是相对与执行cmake操作的目录
set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ../lib)
include_directories(./heads)
add_library(func SHARED src/demo.cpp)
这样就会在lib目录下编译出 libfunc.so. main.cpp
调用时的CMakeLists:
cmake_minimum_required(VERSION 3.0)
project(DEMO)
include_directories(./heads)
link_directories(./lib)
add_executable(run main.cpp)
target_link_libraries(run func)
添加宏
比如nms算法,有cpu和gpu两种实现:
#pragma once
#include "cpu/nms.h"
#ifdef WITH_CUDA
#include "cuda/nms.h"
#endif
宏WITH_CUDA
如何在编译的时候添加进去呢?
可以直接在CMakeLists中添加 add_definitions(-DWITH_CUDA)
。
或者更灵活的通过cmake 参数来实现
option(WITH_CUDA "select to use cuda or not" ON)
if(WITH_CUDA)
add_definitions(-DWITH_CUDA)
... #其它编译命令
else()
... #其它编译命令
endif()
add_executable(...)
cmake -DWITH_CUDA=OFF ..
可以指定ON或OFF。