cmake 实用功能及常用库编译总结

之前在 c++ 编译链接, make, cmake 整理 这里介绍过一点cmake, 这里陆续把自己经常使用的功能总结一下.

[不断补充中]
@19-10-12 补充编译cuda的注意事项

调试需要

set ( CMAKE_VERBOSE_MAKEFILE ON )

target_link_libraries 顺序

这个是有顺序的,在后面的库依赖的越少,在前面的依赖后面的

cmake 文件复用

要是经常写cmake 肯定也有一些重复的功能, 如何能够写到一个文件中, 然后直接在当前的cmake 文件中 include 进来呢?

方法:

假设你有一些常用的功能写在 path/dir/xxx.cmake 中注意最后必须是.cmake
然后你的cmake 文件中应该这样写

list(APPEND CMAKE_MODULE_PATH path)
include(dir/xxx)
# 这样就相当于执行了xxx.cmake的内容

拓展
在windows上, 当你把 某个.cmake 文件放在 cmake安装目录的某个目录下, 这样直接 include 就可以了.

示例

我曾利用这个方法 把我windows上的编译的库整理起来, 想用哪个就直接 include 进来非常方便, 根本不需要用vs进行繁琐的配置.

多个项目, 多个目录原理

采用多个 add_subdirectory

比如

add_subdirectory(1)
add_subdirectory(2Shaders)
add_subdirectory(3texture)
add_subdirectory(4transformations)
add_subdirectory(5coordinate)
add_subdirectory(6camera)

采用foreach

# first create relevant static libraries requried for other projects
add_library(STB_IMAGE "src/stb_image.cpp")
set(LIBS ${LIBS} STB_IMAGE)

add_library(GLAD "src/glad.c")
set(LIBS ${LIBS} GLAD)

foreach(CHAPTER ${CHAPTERS})
    foreach(DEMO ${${CHAPTER}})
        file(GLOB SOURCE
            "src/${CHAPTER}/${DEMO}/*.h"
            "src/${CHAPTER}/${DEMO}/*.cpp"
            "src/${CHAPTER}/${DEMO}/*.vs"
            "src/${CHAPTER}/${DEMO}/*.fs"
            "src/${CHAPTER}/${DEMO}/*.gs"
        )
        set(NAME "${CHAPTER}__${DEMO}")
        add_executable(${NAME} ${SOURCE})
        target_link_libraries(${NAME} ${LIBS})
       
        # copy shader files to build directory
        file(GLOB SHADERS
                 "src/${CHAPTER}/${DEMO}/*.vs"
                 # "src/${CHAPTER}/${DEMO}/*.frag"
                 "src/${CHAPTER}/${DEMO}/*.fs"
                 "src/${CHAPTER}/${DEMO}/*.gs"
        )
        foreach(SHADER ${SHADERS})
            add_custom_command(TARGET ${NAME} PRE_BUILD COMMAND ${CMAKE_COMMAND} -E copy ${SHADER} $<TARGET_FILE_DIR:${NAME}>)
        endforeach(SHADER)

    configure_file(${CMAKE_SOURCE_DIR}/configuration/visualstudio.vcxproj.user.in ${CMAKE_CURRENT_BINARY_DIR}/${NAME}.vcxproj.user @ONLY)
    
    endforeach(DEMO)
endforeach(CHAPTER)

cmake 生成编译文件,执行命令

比如下面的代码就把你的文件拷贝到运行目录下面,核心是 add_custom_command

#copy shader files to build directory
        file(GLOB SHADERS
                 "src/${CHAPTER}/${DEMO}/*.vs"
                 # "src/${CHAPTER}/${DEMO}/*.frag"
                 "src/${CHAPTER}/${DEMO}/*.fs"
                 "src/${CHAPTER}/${DEMO}/*.gs"
        )
        foreach(SHADER ${SHADERS})
            add_custom_command(TARGET ${NAME} PRE_BUILD COMMAND ${CMAKE_COMMAND} -E copy ${SHADER} $<TARGET_FILE_DIR:${NAME}>)
        endforeach(SHADER)

configure_file 这个命令可以帮你在模板文件中写入一些配置

#configure_file(configuration/root_directory.h.in configuration/root_directory.h)
const char * logl_root = "${CMAKE_SOURCE_DIR}";

cmake 编译cuda项目

@19-10-12
我之前用cmake编译cuda的代码有问题, 查了很久之后发现可能是因为我是用的cuda版本太高而且cmake 3.10之后似乎编译cuda变得很简单了, 只需要

project(${targetname} LANGUAGES CUDA C CXX)

然后后面都写成add_library 就行了, 不像以前一样还得用什么 cu_compile 或者 cuda_xxx

参考

设置查找路径

 set(OpenCV_DIR "opencv-2.4.13.6/_build/")
 find_package( OpenCV REQUIRED )

编译例子

opencv3

# https://github.com/opencv/opencv/issues/6494

cmake -D WITH_CUDA=OFF  -D CMAKE_BUILD_TYPE=Release \
-D CMAKE_INSTALL_PREFIX="xxx/bin/opencv3.4/" \
BUILD_NEW_PYTHON_SUPPORT=OFF -D WITH_OPENCL=OFF -D WITH_OPENMP=ON \
-D INSTALL_C_EXAMPLES=OFF -D BUILD_DOCS=OFF -D BUILD_EXAMPLES=OFF \
-D WITH_QT=OFF -D WITH_OPENGL=OFF -D WITH_VTK=OFF -D BUILD_PERF_TESTS=OFF \
-D BUILD_TESTS=ON -D BUILD_opencv_java=OFF -D BUILD_opencv_python=OFF \
-D BUILD_opencv_gpu=OFF  ..

如果遇到 ippicv 下载慢,设法找个下载快的地方,然后拷到项目目录的 .cache/ippicv文件夹下,如下所示
ippcv

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值