CMakeList常用方法

前言


学习几个月的mtcnn以及ssd等目标检测的源码,所以对caffe源码以及cmake基本用法都比较熟悉,而caffe源码的学习更加深了我对于卷积网络的理解,特别是理解mtcnn算法,而学习mtcnn算法则又加深了我对ssd源码的学习,真的感觉自己变强了,不过头发也没秃-_-。近来做项目有车牌识别准备通过mtcnn检测,然后用ssd对字符进行识别,感觉效果应该会比较好(虽然还未实现)。但由于对新知识的渴求,主要是需求在哪里(通过GAN网络生成图片进行训练,当然,次要原因想从源码理解对抗生成网络)。而pytorch的实现比较多,故最近需要学习pytorch,而然看了一天的pytorch以及AlexNet等常见卷积网路的实现,感觉对pytorch还是比较陌生,所以最近想先从源码编译入手,从源码来理解pytorch是如何实现对应的卷积池化等层,然后学习对抗生成网络(GAN)。当然,第一步首先是学习CMake然后找到对应的源码,所以在这里做一下笔记记录下来 -------------------- 2018.11.29






#CMake常用预定义变量


  • PROJECT_SOURCE_DIR 所运行的CMakeList.txt所在文件夹下的工程目录
  • CMAKE_CURRENT_SOURCE_DIR 当前处理的CMakeLists.txt所在的目录

在cmake还可以添加c++文件中的宏定义:

add_compile_definitions()
  • 比如我们如果在所需编译的c++代码中调用了#ifdef CUDA,我们可以在CMakeList.txt文件中使用add_compile_definitions(CUDA)来声明C++中的宏定义.

#常用的cmake语法


  • 命令行中输出消息:
#输出Hello World!字符串
message("Hello World!")

  • 头文件目录:
include_directories(${PROJECT_SOURCE_DIR}/include)

  • 链接库目录:
link_directories(${PROJECT_SOURCE_DIR}/lib)

  • 将第一个参数所赋值的目录下的所有源文件(.cpp)的文件列表赋值给第二个参数参数:
#将${PROJECT_SOURCE_DIR}/src目录下的所有源文件列表赋值给DIR_SRCS.
AUX_SOURCE_DIRECTOR(${PROJECT_SOURCE_DIR}/src DIR_SRCS)

  • 将文件加下所有匹配第三个参数的字符串的文件列表赋值给第二个参数
#将src文件夹及其子文件夹下的.cpp结尾文件列表赋值给DIRS变量
file(GLOB_RECURSE DIRS "${PROJECT_SOURCE_DIR}/src/*.cpp")
  • 添加库
$连接生成静态库Hello文件
add_library(Hello SHARED ${DRIS_SRCS})
  • 生成CUDA可执行文件
cuda_add_executable(CNN main.cpp)
  • 连接静态库与可执行文件
target_link_libraries(CNN cublas Hello glog cudart)
  • 在cmake中执行shell脚本,如果成功,则后面对应的_exitcode值为0
execute_process(
        COMMAND "/usr/bin/python" "--version"
        RESULT_VARIABLE _exitcode
)

  • 定义声明自己的库模块
# 声明将要使用cmake中的FindPackageHandleStandardArgs模块
include(FindPackageHandleStandardArgs)
# 如果GFLAGS_INCLUDE_DIR以及GFLAGS_LIBRARY找到了,将GFLAGS_FOUND设置为true,否则false。DEFAULT_MSG设置默认打印消息。
find_package_handle_standard_args(GFlags DEFAULT_MSG GFLAGS_INCLUDE_DIR GFLAGS_LIBRARY)

你可能感兴趣的:(C++编程)