cmake


原文链接: cmake

Campanula/CMake-tutorial: CMake 官方教程
BrightXiaoHan/CMakeTutorial: CMake中文实战教程

CMAKE_CURRENT_SOURCE_DIR
这是当前处理的CMakeLists.txt所在的目录

CMAKE_CURRENT_LIST_DIR
(自2.8.3开始)这是当前正在处理的列表文件的目录

cmake uninstall 卸载安装后的文件

cat install_manifest.txt | sudo xargs rm

camke 静态编译.a undefined reference to `routing_record'

collect2: error: ld returned 1 exit status

aux_source_directory(. DIR_SRCS)

add_executable(${TARGETS} ${DIR_SRCS})

target_link_libraries(${TARGETS}  -Wl,--start-group)    #
foreach(findlib ${LIBNAMES})
    target_link_libraries(${TARGETS} ${findlib})
endforeach()

find_package("Threads")
target_link_libraries(${TARGETS} ${CMAKE_THREAD_LIBS_INIT} )

# set(CMAKE_C_FLAGS ${CMAKE_C_FLAGS} "-pthread")

target_link_libraries(${TARGETS} -Wl,--end-group )
#Set cross compilation information
set(CMAKE_SYSTEM_NAME Generic)
set(CMAKE_SYSTEM_PROCESSOR arm)

# GCC toolchain prefix
set(TOOLCHAIN_PREFIX "arm-none-eabi")

set(CMAKE_C_COMPILER ${TOOLCHAIN_PREFIX}-gcc)
set(CMAKE_CXX_COMPILER ${TOOLCHAIN_PREFIX}-g++)
set(CMAKE_ASM_COMPILER ${TOOLCHAIN_PREFIX}-as)
set(CMAKE_AR ${TOOLCHAIN_PREFIX}-ar)
set(CMAKE_OBJCOPY ${TOOLCHAIN_PREFIX}-objcopy)
set(CMAKE_OBJDUMP ${TOOLCHAIN_PREFIX}-objdump)

enable_language(ASM)

set(CPU "-mcpu=cortex-m4")
set(FPU "-mfpu=fpv4-sp-d16 -mfloat-abi=softfp")
set(CMAKE_ASM_FLAGS "${CMAKE_ASM_FLAGS} -mthumb ${CPU}  ${FPU} -MD")
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -mthumb ${CPU} ${FPU} -std=gnu99 -Os -ffunction-sections -fdata-sections -MD -Wall -pedantic")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -mthumb ${CPU} ${FPU}  -Os -ffunction-sections -fdata-sections -MD -Wall -pedantic -fno-exceptions -fno-rtti")

set(CMAKE_SHARED_LIBRARY_LINK_C_FLAGS "")
set(CMAKE_SHARED_LIBRARY_LINK_CXX_FLAGS "")
set(CMAKE_EXE_LINKER_FLAGS "-T${PROJECT_SOURCE_DIR}/tm4c123g.ld -specs=${PROJECT_SOURCE_DIR}/tiva.specs")

# Processor specific definitions
add_definitions(-DPART_TM4C123GH6PM)
add_definitions(-DTARGET_IS_TM4C123_RA1)
add_definitions(-Dgcc)

set(FLASH_EXECUTABLE "lm4flash")
ADD_CUSTOM_TARGET("flash" DEPENDS ${CMAKE_PROJECT_NAME}.axf 
  COMMAND ${CMAKE_OBJCOPY} -O binary ${CMAKE_PROJECT_NAME}.axf ${CMAKE_PROJECT_NAME}.bin 
  COMMAND ${FLASH_EXECUTABLE} ${CMAKE_PROJECT_NAME}.bin
)

cmake:使用 CMAKE_INSTALL_PREFIX 来指定install的安装目录

方法1 在执行cmake时指定:

cmake -DCMAKE_INSTALL_PREFIX=<你想要安装的路径>

方法二 设置CMAKE_INSTALL_PREFIX 变量:

在 PROJECT(< project_name>) 之后。`SET(CMAKE_INSTALL_PREFIX /usr/local/)`

 

在设置完install的安装目录之后,执行install时可以通过DESTINATION直接指定安装目录之下的目录

set(CMAKE_INSTALL_PREFIX /usr/local)
install(TARGETS test DESTINATION bin) #将test安装到/usr/local/bin目录下

二 构建交叉编译的CMakeLists.txt

说明:

设置交叉编译之前,必须在CMakeList.txt前面加上这样一句,这样CMake才会认为你是要交叉编译:

SET(CMAKE_SYSTEM_NAME Linux)

在通知CMake要交叉编译以后,还要告诉CMake到哪个路径下去找库文件,因为在交叉编译的时候CMake是不会自动去系统默认的目录找库文件和头文件的:

SET(CMAKE_FIND_ROOT_PATH "编译器环境路径")
SET(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)
SET(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)
SET(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)

其中的第一行,是告诉CMake查找的根目录是什么。
后面分别是告诉CMake怎么查找编译时候的工具程序的位置、库的位置和头文件的位置。
设置为NEVER表示不查找,设置为ONLY表示只在CMAKE_FIND_ROOT_PATH设定的目录下查找,设置为BOTH(这是默认选项)表示既可以在系统目录下查找,也可以在CMAKE_FIND_ROOT_PATH下查找。因为咱们是交叉编译,所以后两项的设置了ONLY,对于编译时调用工具,一般来说是需要在系统目录下查找的,不过我不需要所以设置为NEVER。

然后,设置编译器:

SET(CMAKE_C_COMPILER "编译器环境路径")

直接把编译器的路径设置过去就可以了,CMAKE_C_COMPILER是C语言编译器,CMAKE_CXX_COMPILE是C++语言编译器。

所以 在工程主CMakeLists.txt 中首先加入如下:


SET ( CMAKE_SYSTEM_NAME Linux )
SET ( CMAKE_SYSTEM_PROCESSOR arm )

# when hislicon SDK was installed, toolchain was installed in the path as below: 
# SET ( CMAKE_C_COMPILER /opt/hisi-linux/x86-arm/arm-himix200-linux/bin/arm-himix200-linux-gcc )
# SET ( CMAKE_CXX_COMPILER /opt/hisi-linux/x86-arm/arm-himix200-linux/bin/arm-himix200-linux-g++ )
set(CMAKE_C_COMPILER "arm-none-linux-gnueabi-gcc")
set(CMAKE_CXX_COMPILER "arm-none-linux-gnueabi-g++")
# set searching rules for cross-compiler
# SET(TOOLCHAIN_DIR "/opt/mv_pro_4.0/montavista/pro/devkit/arm/v5t_le")  
# SET(CMAKE_FIND_ROOT_PATH ${TOOLCHAIN_DIR})  
SET ( CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER )
SET ( CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY )
SET ( CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY )

# set ${CMAKE_C_FLAGS} and ${CMAKE_CXX_FLAGS}flag for cross-compiled process
SET ( CROSS_COMPILATION_ARM himix200 )
SET ( CROSS_COMPILATION_ARCHITECTURE armv7-a )

# set g++ param
SET ( CMAKE_CXX_FLAGS "-std=c++11 -march=armv7-a -mfloat-abi=softfp -mfpu=neon-vfpv4  ${CMAKE_CXX_FLAGS}" )

add_definitions(-D__ARM_NEON)
# add_definitions(-D__ANDROID__)

cmake_minimum_required(VERSION 2.8)
project( DisplayImage )
find_package( OpenCV REQUIRED )
include_directories( ${OpenCV_INCLUDE_DIRS} )
add_executable( DisplayImage DisplayImage.cpp ) # 生成可执行文件
target_link_libraries( DisplayImage ${OpenCV_LIBS} )

CMake 链接第三方的库 和 添加C++11的支持

# CMake 最低版本号要求
cmake_minimum_required (VERSION 2.8)
# 项目信息
project (server)
# 查找当前目录下的所有源文件
# 并将名称保存到 DIR_SRCS 变量
aux_source_directory(. DIR_SRCS)

# 添加第三方的库
set(INC_DIR /usr/local/include/)
set(LINK_DIR /usr/local/lib)

include_directories(${INC_DIR})
link_directories(${LINK_DIR})
link_libraries(ev)


# 指定生成目标
add_executable(server ${DIR_SRCS})

# 将第三方的库链接到可执行文件
target_link_libraries(server ev)

那要怎么样, 才能支持C++11呢?

很简单, 在版本要求的下面, 加上这两句话, 就行了

SET(CMAKE_C_COMPILER g++)
add_compile_options(-std=c++14)

————————————————
版权声明:本文为CSDN博主「奔跑的龙少」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/shine_journey/article/details/78732809

cmake是gnu工具链中构建项目的重要一环,而且在windows Linux OS X中都可以使用,是程序员(特别是linux程序员,因为windows上有无比强大的VS)必备的基本功。

命名变量
set(INC_DIR /usr/local/include)
set(LINK_DIR /usr/local/lib)
set(SOURCE_FILES main.cpp)

去哪里找头文件 相当于gcc/clang 中的-I(i的大写字母)参数
include_directories(${INC_DIR}) # 用${}引用变量

去哪里找库文件 .so .dll .dylib 相当于gcc 中的-L参数
link_directories(${LINK_DIR})

要链接的库文件的名字 相当于gcc中的-l(小写的l)参数
target_link_libraries(test_boost boost_filesystem boost_system)
只写库名就可以,就是libxxx.so的中间xxx的部分

也可以写成下面这样
target_link_libraries(test_boost
boost_filesystem
boost_system)
通过上面的这些关键词,我们就可以使用第三方库了。

作者:lcode
链接:https://www.jianshu.com/p/33126d6baa3c
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

前言

前面的文章介绍了一个最简单的CMake工程,这篇文章将介绍一个稍微复杂一些的CMake工程,结合这个工程总结一下在组织一个C/C++工程时最为常用的一些CMake命令和变量。对于涉及到的命令和变量,介绍的原则是点到即止,先仅需掌握基本用法即可,让工程跑起来。

上一篇文章中那个最简单的CMake Hello World工程,在其CMake脚本文件CMakeLists.txt中,仅有一句话:

```c
add_executable(hello hello.cpp)
```

这里面的add_executable就是一个CMake命令,它的作用是添加一个可执行文件构建目标。

下面从一个C++应用程序的编译过程为脉络对涉及到的命令和变量进行说明。

为了让下面的说明举例更加容易理解,先给出本文的示例工程目录结构:

```c
➜  /Users/sunyongjian1/codes/local_codes/cmake_test tree
.
├── CMakeLists.txt
├── include
│   └── util.h
├── lib
│   └── libutil.a
└── src
    └── main.cpp
```

三个文件夹: include, lib, src分别存放包含文件,库文件,源文件;一个CMakeLists.txt脚本。下面我的任务是编写这个脚本,使得工程包含util.h头文件,编译main.cpp, 链接libutil.a, 最终生成一个可执行文件hello.

给工程起个名字

加上这句:project(hello)

解释

命令:project(<PROJECT-NAME> [LANGUAGES] [<language-name>...])

作用:定义工程名称, 设置几个变量的名字: PROJECT_NAME, PROJECT_SOURCE_DIR, <PROJECT-NAME>_SOURCE_DIR, PROJECT_BINARY_DIR, <PROJECT-NAME>_BINARY_DIR, 高级用法请见参考链接2:CMake命令

让CMake找到我的头文件

加上这句:include_directories(./include)

作用:把当前目录(CMakeLists.txt所在目录)下的include文件夹加入到包含路径

我习惯这样写:include_directories(${CMAKE_CURRENT_LIST_DIR}/include)

解释

命令: include_directories([AFTER|BEFORE] [SYSTEM] dir1 [dir2 ...])

作用:

  • 把dir1, [dir2 …]这(些)个路径添加到当前CMakeLists及其子CMakeLists的头文件包含路径中;

  • AFTER 或者 BEFORE 指定了要添加的路径是添加到原有包含列表之前或之后

  • 若指定 SYSTEM 参数,则把被包含的路径当做系统包含路径来处理

第二种写法里用到了CMAKE_CURRENT_LIST_DIR这个变量,它表示当前CMakeLists所在的路径.

让CMake找到我的源文件

加上: aux_source_directory(./src ${hello_src})

作用: 把当前路径下src目录下的所有源文件路径放到变量hello_src

解释

命令:aux_source_directory(<dir> <variable>)

作用:查找dir路径下的所有源文件,保存到variable变量中.

上面的例子中,hello_src是一个自定义变量,在执行了aux_source_directory(./src ${hello_src})之后,我就可以像这样来添加一个可执行文件:add_executable(hello ${hello_src}), 意思是用hello_src里面的所有源文件来构建hello可执行程序, 不用手动列出src目录下的所有源文件了。

注意:

  • aux_source_directory 不会递归包含子目录,仅包含指定的dir目录

  • CMake官方不推荐使用aux_source_directory及其类似命令(file(GLOB_RECURSE …))来搜索源文件,原因是这样包含的话,如果我再在被搜索的路径下添加源文件,我不需要修改CMakeLists脚本,也就是说,源文件多了,而CMakeLists并不需要(没有)变化,也就使得构建系统不能察觉到新加的文件,除非手动重新运行cmake,否则新添加的文件就不会被编译到项目结果中。

  • 类似include_directories()CMAKE_CURRENT_LIST_DIR的用法,也可以写成:aux_source_directory(${CMAKE_CURRENT_LIST_DIR}/src ${hello_src})

让CMake找到我的库文件

加上:link_directories(${CMAKE_CURRENT_LIST_DIR}/lib)

解释

命令:link_directories(directory1 directory2 ...)

作用:不必细说,与include_directories()类似,这个命令添加了库包含路径。

告诉CMake我的构建目标

加上:add_executable(${PROJECT_NAME} ${hello_src})

解释

命令:add_executable(<name> [WIN32] [MACOSX_BUNDLE] [EXCLUDE_FROM_ALL] source1 [source2 ...])

作用:目前仅需知道,其作用是使用${hello_src}里面的源文件来生成一个可执行文件,起名叫${PROJECT_NAME}, 即hello. 在一开始定义的那个project(hello)中的hello。

告诉CMake我要链接哪个库文件

加上:target_link_libraries(${PROJECT_NAME} util)

解释

命令:target_link_libraries(<target> [item1 [item2 [...]]] [[debug|optimized|general] <item>] ...)

作用:仅需知道,名字叫${PROJECT_NAME}这个target需要链接util这个库,会优先搜索libutil.a(windows上就是util.lib), 如果没有就搜索libutil.so(util.dll, util.dylib)’

上面的例子意思是,让hello去链接util这个库。

传递FLAGS给C++编译器

如果我的main.cpp里面用到了C++11,那么我需要告诉CMake在生成的Makefile里告诉编译器启用C++11。与此类似,我可能也要传递其他FLAGS给编译器,怎么办?

答案是:设置CMAKE_CXX_FLAGS变量

加上:

```c
set(CMAKE_CXX_COMPILER      "clang++" )         # 显示指定使用的C++编译器

set(CMAKE_CXX_FLAGS   "-std=c++11")             # c++11
set(CMAKE_CXX_FLAGS   "-g")                     # 调试信息
set(CMAKE_CXX_FLAGS   "-Wall")                  # 开启所有警告

set(CMAKE_CXX_FLAGS_DEBUG   "-O0" )             # 调试包不优化
set(CMAKE_CXX_FLAGS_RELEASE "-O2 -DNDEBUG " )   # release包优化
```

解释

  • CMAKE_CXX_FLAGS 是CMake传给C++编译器的编译选项,通过设置这个值就好比 g++ -std=c++11 -g -Wall
  • CMAKE_CXX_FLAGS_DEBUG 是除了CMAKE_CXX_FLAGS外,在Debug配置下,额外的参数
  • CMAKE_CXX_FLAGS_RELEASE 同理,是除了CMAKE_CXX_FLAGS外,在Release配置下,额外的参数

开始构建

通过以上步骤, 最后,在文件头部添加CMake版本检查,以我的电脑上的环境为例,我的CMake版本是3.0,那么我在脚本最开始加上:

cmake_minimum_required ( VERSION 3.0)

完整的CMakeLists.txt如下所示:

cmake_minimum_required ( VERSION 3.0)

project(hello)
include_directories(${CMAKE_CURRENT_LIST_DIR}/include)
link_directories(${CMAKE_CURRENT_LIST_DIR}/lib)
aux_source_directory(${CMAKE_CURRENT_LIST_DIR}/src ${hello_src})
add_executable(${PROJECT_NAME} ${hello_src})
target_link_libraries(${PROJECT_NAME} util)
set(CMAKE_CXX_COMPILER      "clang++" )         # 显示指定使用的C++编译器
set(CMAKE_CXX_FLAGS   "-std=c++11")             # c++11
set(CMAKE_CXX_FLAGS   "-g")                     # 调试信息
set(CMAKE_CXX_FLAGS   "-Wall")                  # 开启所有警告
set(CMAKE_CXX_FLAGS_DEBUG   "-O0" )             # 调试包不优化
set(CMAKE_CXX_FLAGS_RELEASE "-O2 -DNDEBUG " )   # release包优化

在CMakeLists.txt所在目录,新建build目录,并切换进build进行构建即可. 具体构建方法参见上一篇CMake Hello World的构建。

注意:生成的可执行文件路径会在build/src目录下,如需修改生成位置,请参考CMake变量EXECUTABLE_OUTPUT_PATH

总结

本文通过一个C++工程实例,介绍了构建过程中用到的一些CMake命令和变量.

后面的文章将会讲解如何构建更加复杂的C++工程,会用到CMake里的function和其他命令和变量。

参考链接

  • CMake Documentation(V3.0为例)

  • CMake 变量

  • cmake_minimum_required(VERSION 3.5)指令:作用:规定cmake程序的最低版本;可选;如果CMakeLists.txt文件中使用了一些高版本cmake特有的一些命令的时候,就需要加上这样一行,提醒用户升级到该版本之后再执行cmake

  • PROJECT 指令:声明一个工程;语法: PROJECT(projectname [CXX] [C] [Java]),projectname:定义工程名称,[CXX]…:指定工程支持的语言列表,可忽略的,默认表示支持所有语言;这个指令隐式的定义了两个 cmake 变量:_BINARY_DIR和_SOURCE_DIR变量,前者表示编译输出的路径;后者表示工程所在的路径。

  • ADD_SUBDIRECTORY:添加需要编译的源文件的子目录;语法: ADD_SUBDIRECTORY(source_dir [binary_dir] [EXCLUDE_FROM_ALL]),source_dir:向当前工程添加存放源文件的子目录,[binary_dir]:指定目标文件存放的位置,[EXCLUDE_FROM_ALL]:将该目录从编译过程中排除。

  • INCLUDE_DIRECTORIES 指令:向工程添加多个特定的头文件搜索路径;INCLUDE_DIRECTORIES([AFTER|BEFORE] [SYSTEM] dir1 dir2 …);参数说明:[AFTER|BEFORE]:控制路径添加顺序,追加or置前

  • LINK_DIRECTORIES 指令:添加非标准的共享库搜索路径;LINK_DIRECTORIES(directory1 directory2 …);directory1:要添加的目录路径

  • TARGET_LINK_LIBRARIES 指令:来为 target 添加需要链接的共享库;TARGET_LINK_LIBRARIES(target library1)

  • SET 指令:显式的定义变量;SET(VAR [VALUE] [CACHE TYPE DOCSTRING [FORCE]]);VAR:变量名 [VALUE]:变量值

  • ADD_EXECUTABLE 指令:添加要执行的编译命令;ADD_EXECUTABLE(target [Value]);target:要编译输出目标的名字,[Value]:需要的源文件

  • MESSAGE 指令功能说明: 于向终端输出用户定义的信息;语法: MESSAGE([SEND_ERROR | STATUS | FATAL_ERROR] “message to display” …);[SEND_ERROR | STATUS | FATAL_ERROR]:产生错误,生成过程被跳过 | 输出前缀为—的信息 | 立即终止所有 cmake 过程

  • INSTALL 指令:将编译生成的文件分类安装到制定的目录路径。

  • add_library():生成库生成库文件,可传入多个源文件;add_library(your_library libsrc1.cpp libsrc2.cpp libsrc_etc.cpp )

  • add_executable():生成可执行文件;生成可执行文件,可以传入多个源文件 add_executable(my_node src0.cpp src1.cpp src2.cpp )

  • add_subdirectory():一般情况下,我们的项目各个子项目都在一个总的项目根目录下,但有的时候,我们需要使用外部的文件夹,怎么办呢?add_subdirectory命令,可以将指定的文件夹加到build任务列表中。

  • add_dependencies():添加依赖项,在使用ROS的message、service、action时注意添加

  • add_message_files():添加message文件。

  • add_service_files():添加service文件

  • add_action_files() :添加action文件

1、使用set进行变量设置

之前使用:aux_source_directory命令将目录下的所有.cpp文件储存到变量里面,这样,我们就不用一个一个去添加源文件来生成可执行文件,其实我们使用set命令也可以完成此操作。

#将untile.h以及untile.cpp两个文件添加到SrcPath这个变量里面
set(SrcPath untile.h untile.cpp)

#然后我们在调用add_executable命令生成可执行文件,依赖于main.cpp以及变量SrcPath里面的文件生成可执行#文件:Demo
add_executable(Demo main.cpp ${SrcPath})

#我们在调用add_library来生成静态库
add_library(LibFile ${SrcPath})
2、添加第三方库

通常我们需要添加第三方的库目录或者库文件,此时CMake提供给我们的命令有:

include_directories、 link_directories、 link_libraries

include_directories:添加我们需要的头文件的文件目录

link_directories:添加我们需要连接的库文件的文件目录

link_libraries:添加我们需要链接的库文件

#添加我们需要的头文件的文件目录
include_directories("../Src/include/math")

#添加我们需要连接的库文件的文件目录
link_directories("../Src/lib")

#添加我们需要链接的库文件
link_libraries("../Src/lib/Untile.lib")
3、添加编译选项

添加编译选项其实有两个命令:set和add_compile_options

两个选项还是有一定的区别的。

add_compile_options命令添加的编译选项是针对所有的编译器,包括C的编译器和C++的编译器。

set添加的编译选项,通过设置的变量:CMAKE_C_FLAGS和CMAKE_CXX_FLAGS设置的是C或者C++的编译器
————————————————
版权声明:本文为CSDN博主「DY_1024」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/DY_1024/article/details/83142721

最近需要自己写CMakaList,所以简要写一下一些基本的操作。为图实用,只写了常用的简单操作。

1.确定cmake最低版本需求
cmake_minimum_required(VERSION 3.0.0)
1
2.确定工程名
project(XXX)
1
这个不是必须,但是最好写一下,这一行会引入两个变量XXX_BINARY_DIR (二进制文件保存路径)和 XXX_SOURCE_DIR(源代码保存路径)

3.添加需要的库
set(CMAKE_PREFIX_PATH ${CMAKE_PREFIX_PATH} "/usr/local/share/OpenCV")
find_package(OpenCV 3.2.0 REQUIRED)

find_package令CMake搜索所有名为Find.cmake的文件,3.2.0 REQUIRED给出需要的具体版本,以避免一台电脑安装了多个版本opencv而造成不必要的错误。通常情况下,通过设置CMAKE_PREFIX_PATH来设置CMake搜索路径,通常情况下不加也可以,但考虑到代码的可移植性,最好还是对搜索路径进行对应设置

4.添加需要的头文件
include_directories(include)
include_directories(${OpenCV_INCLUDE_DIRS})
include_directories(/usr/local/cuda-8.0/include/)
1
2
3
如上,将头文件所在路径写在括号内即可(上例中将头文件放在了include文件夹中),而需要的一些库的头文件可以如2行变量的形式,也可以如3行直接给出库头文件所在的位置

5.确定编译语言
以使用c++为例,可以用set来设定

set(CMAKE_CXX_STANDARD 11)
1
也可以通过add_definitions来设定

add_definitions(-std=c++11)
1
6.设定变量
ADD_DEFINITIONS( -DGPU -DCUDNN )
1
如darknet中代码编译需要define变量GPU,CUDNN,OPENCV等,则用该语句进行定义

7.添加源代码
set(SRC ${PROJECT_SOURCE_DIR}/test.cpp)
1
通过设定SRC变量,将源代码路径都给SRC,如果有多个,可以直接在后面继续添加:

set(SRC

${PROJECT_SOURCE_DIR}/src/detector.cpp
${PROJECT_SOURCE_DIR}/src/demo.cpp
${PROJECT_SOURCE_DIR}/test.cpp

)
1
2
3
4
5
8.编译动态库并链接库文件
link_directories(${PROJECT_SOURCE_DIR})
add_library(plate_recognition SHARED ${SRC})
target_link_libraries(plate_recognition ${OpenCV_LIBS})
target_link_libraries(plate_recognition -llianghao -lpthread -lm -lstdc++)
1
2
3
4
add_library为生成库文件,SHARED为生成动态库,STATIC为生成静态库,前面的plate_recognition为生成的文件名,如上生成的动态库为libplate_recognition.so,最后${SRC}为源文件路径。
target_link_libraries为链接需要的库,plate_recognition为需要进行链接的文件名,后面接需要链接的库,如第三行链接了opencv。如果需要链接其他的动态库,-l后接去除lib前缀和.so后缀的名称,以链接liblianghao.so为例,-llianghao。

9.生成可执行文件
link_directories(${PROJECT_SOURCE_DIR})
add_executable(Test ${SRC})
target_link_libraries(Test ${OpenCV_LIBS})
target_link_libraries(Test -llianghao -lpthread -lm -lstdc++)

和8中只有第二行的区别,add_executable表示生成可执行文件,Test为生成的可执行文件名,后接源文件路径。

10.整体实例

cmake_minimum_required(VERSION 3.2.0)
add_definitions(-std=c++11)
add_definitions(-g -o2)
#define cuda,opencv,cudnn
ADD_DEFINITIONS( -DGPU -DCUDNN ) 
# use opencv
set(CMAKE_PREFIX_PATH ${CMAKE_PREFIX_PATH} "/usr/local/share/OpenCV")
find_package(OpenCV 3.2.0 REQUIRED)
if(NOT OpenCV_FOUND)
  message(WARNING "OpenCV not found!")
else()
  include_directories(${OpenCV_INCLUDE_DIRS})
endif()
# CUDA path
include_directories(/usr/local/cuda-8.0/include/)
# headers
include_directories(${PROJECT_SOURCE_DIR}/include)
#sources
set(SRC  ${PROJECT_SOURCE_DIR}/test.cpp)
#lib link
link_directories(${PROJECT_SOURCE_DIR})
#build so
add_library(plate_recognition SHARED ${SRC})
target_link_libraries(plate_recognition ${OpenCV_LIBS})
target_link_libraries(plate_recognition -lxxx -lxxx   -lpthread -lm -lstdc++)

————————————————
版权声明:本文为CSDN博主「深夜虫鸣」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/u010122972/article/details/78216013

`