CmakeLists.txt书写规范


Cmake的语法规则 参考

开头部分-指定输出路径

  • 指定 cmake版本
  • 指定 project name
  • 指定生成文件的输出目录
cmake_minimum_required(VERSION 2.8)
project(project_name)

message("-- system arch:  ${CMAKE_SYSTEM_PROCESSOR}")
message("-- output path:  ${PROJECT_OUTPUT_DIR} ")

# set output path
set(PROJECT_OUTPUT_DIR ${PROJECT_BINARY_DIR}/${CMAKE_SYSTEM_PROCESSOR})
SET(PROJECT_INCLUDE_DIR ${PROJECT_OUTPUT_DIR}/include)

# mkdir directory
file(MAKE_DIRECTORY ${PROJECT_INCLUDE_DIR}) 
FILE(MAKE_DIRECTORY ${PROJECT_OUTPUT_DIR}/bin)
FILE(MAKE_DIRECTORY ${PROJECT_OUTPUT_DIR}/lib)

## set the target path
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${PROJECT_OUTPUT_DIR}/bin)
set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${PROJECT_OUTPUT_DIR}/lib)
set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${PROJECT_OUTPUT_DIR}/lib)

这样Cmake生成的的输出路径是 在architecture文件夹下有bin ,lib, include 三个子文件夹,分别存放可执行文件,库文件和头文件

中间部分-指定工程依赖

  • 指定工程需要用到的一些系统包和库
  • 指定依赖的库文件
find_package(PkgConfig)
	pkg_check_modules(GSTREAMER QUIET gstreamer-1.0)
	pkg_check_modules(GST_APP REQUIRED gstreamer-app-1.0)

find_package(Qt4 REQUIRED)
find_package(CUDA)
find_package(OpenGL)
find_package(OpenCV)

## set c++11 编译选项
# -std=c++11 包含C++11特性
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11")	

## set CUDA NVCC编译选项
set(
	CUDA_NVCC_FLAGS
	${CUDA_NVCC_FLAGS}; 
    -O3 
	-gencode arch=compute_53,code=sm_53
    -gencode arch=compute_62,code=sm_62  ##TX2
    -gencode arch=compute_30,code=sm_30
)

#INCLUDE for c/C++ include
include_directories(${PROJECT_INCLUDE_DIR})
include_directories(
    /usr/include/gstreamer-1.0
    /usr/lib/${CMAKE_SYSTEM_PROCESSOR}-linux-gnu/gstreamer-1.0/include
    /usr/include/glib-2.0
    /usr/include/libxml2 /usr/lib/${CMAKE_SYSTEM_PROCESSOR}-linux-gnu/glib-2.0/include
    /usr/include/opencv2
)

结尾部分-指定输出文件

#create executable-file
add_executable(exe-filename needed-C_or_C++file)

#create shared-library
add_library(lib-filename SHARED needed-files-list)

## CUDA 版本
cuda_add_executable(exe-filename needed-cu_file)
cuda_add_library(lib-filename SHARED needed-cu_files-list)


## 对于有多个文件可以先创建一个变量 file-list
 file(GLOB gstcam_source  lib/gstreamer/*cpp  lib/image/*cpp lib/cuda/*cpp lib/cuda/*cu  lib/opengl/*cpp  )
 file(GLOB gstcam_include lib/gstreamer/*h  lib/image/*h lib/cuda/*h lib/opengl/*h)

## 循环打印一下看看
 foreach(sources ${gstcam_source})
 MESSAGE("-- the ${PROJECT_NAME}  contion ${sources}")     
 endforeach(sources ${})
 
 
## creat gstcam shared library
cuda_add_library(${PROJECT_NAME} SHARED ${gstcam_source})
target_link_libraries(${PROJECT_NAME}    Qt4::QtGui GL GLEW gstreamer-1.0 gstapp-1.0 ${OpenCV_LIBS})

# transfer all headers to the include directory
foreach(include ${gstcam_include})
	message("-- Copying ${include}")
	configure_file(${include} ${PROJECT_INCLUDE_DIR} COPYONLY)
endforeach()

## create exe-file
add_executable(gst_app_test src/gst-camera.cpp)
target_link_libraries(gst_app_test ${PROJECT_NAME})

CMakeLists.txt链接库文件的方式

区分link_directories, link_libraries , target_link_libraries

include_directories(添加头文件目录)

它相当于g++选项中的-I参数的作用,也相当于环境变量中增加路径到CPLUS_INCLUDE_PATH变量的作用

include_directories(
  ${AIRSIM_ROOT}/AirLib/include
  ${AIRSIM_ROOT}/AirLib/include/controllers
  ${RPC_Lib}/include
  # ${AIRSIM_ROOT}/AirLib/deps/MavLinkCom/include
  # ${AIRSIM_ROOT}/AirLib/deps/rpclib/include
  ${EIGEN3_INCLUDE_DIR}
  ${catkin_INCLUDE_DIRS}
  ${PCL_INCLUDE_DIRS}
	${OpenCV_INCLUDE_DIRS}
  #/usr/local/cuda/include/
  include
)

link_directories(添加需要链接的库文件目录)

它相当于g++命令的-L选项的作用,也相当于环境变量中增加LD_LIBRARY_PATH的路径的作用。

find_package(Eigen3 REQUIRED)
find_package(OpenCV REQUIRED)
find_package(PCL    REQUIRED)

##可以是本地库,也可以是系统库

link_directories(
  ${AIRSIM_ROOT}/AirLib/lib
  ${AIRSIM_ROOT}/AirLib/deps/MavLinkCom/lib
  ${AIRSIM_ROOT}/AirLib/deps/rpclib/lib
  ${PCL_LIBRARY_DIRS}
)

link_libraries (添加需要链接的库文件路径,注意这里是全路径)

它相当于g++选项中的-I参数的作用,也相当于环境变量中增加路径到CPLUS_INCLUDE_PATH变量的作用

target_link_libraries(设置要链接的库文件的名称)

CMakeLists.txt文件链接有两种方式

  • include_directories + link_directories+target_link_libraries
  • include_directories+link_libraries
cmake_minimum_required(VERSION 2.8 FATAL_ERROR)
include_directories("/opt/MATLAB/R2012a/extern/include")    
LINK_DIRECTORIES("/opt/MATLAB/R2012a/bin/glnxa64")      
add_executable(myProject main.cpp)     
target_link_libraries(myProject eng mx)     
#equals to below 
#target_link_libraries(myProject -leng -lmx) 
#target_link_libraries(myProject libeng.so libmx.so)
cmake_minimum_required(VERSION 2.8 FATAL_ERROR) 
include_directories("/opt/MATLAB/R2012a/extern/include")  
#directly link to the libraries. 
LINK_LIBRARIES("/opt/MATLAB/R2012a/bin/glnxa64/libeng.so") 
LINK_LIBRARIES("/opt/MATLAB/R2012a/bin/glnxa64/libmx.so")
#equals to below 
#LINK_LIBRARIES("/opt/MATLAB/R2012a/bin/glnxa64/libeng.so" "/opt/MATLAB/R2012a/bin/glnxa64/libmx.so") 
add_executable(myProject main.cpp
  • 3
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

一銤阳光

希望分享的内容对你有帮助

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值