之前在 c++ 编译链接, make, cmake 整理 这里介绍过一点cmake, 这里陆续把自己经常使用的功能总结一下.
[不断补充中]
@19-10-12 补充编译cuda的注意事项
文章目录
- 调试需要
- target_link_libraries 顺序
- cmake 文件复用
- 方法:
- 示例
- 多个项目, 多个目录原理
- 采用多个 add_subdirectory
- 采用foreach
- cmake 生成编译文件,执行命令
- cmake 编译cuda项目
- 设置查找路径
- 编译例子
- opencv3
调试需要
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文件夹下,如下所示