ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

【cmke】cmake相关的记录

2022-06-25 11:33:24  阅读:139  来源: 互联网

标签:cmake 记录 OpenCV add cmke cpp hello LIBS


之前在电脑本地的一些记录,记录遍布各个文件夹,需要的时候查找翻阅不便,现归纳到此。

单文件的cmake

1、内部编译

hello.cpp

#include <iostream>
using namespace std;

int main(int argc, char **argv) {
  cout << "Hello test!" << endl;
  return 0;
}

CMakeLists.txt

# 声明要求的cmake最低版本
cmake_minimum_required( VERSION 2.8 )
    
# 声明一个cmake工程
project(Hello)
    
# 添加一个可执行程序
# 语法:add_executable( 程序名  源代码文件 )
add_executable( hello hello.cpp)

用cmake对工程进行编译,cmake后面有一个英文输入法的句号,表示在当前目录下进行cmake:

cmake .

用make命令对工程进行编译:

make

运行:

./hello

想新增一个可执行文件,在CMakeLists.txt中添加一行'add_executable'命令即可。

2、外部编译

新建中间文件夹:mkdir build
进入该文件夹:cd build
用cmake进行编译(两个英文输入法的句号表示对父目录进行cmake编译):cmake ..
用make进行编译:make,这样cmake产生的中间文件就会生成在build文件夹中,与源代码分开,当发布源代码时,只要把build文件夹删掉即可。

3、使用库

Linux中,库文件分成 静态库共享库两种。
静态库以.a作为后缀名,静态库每次调用都会生成一个副本。
共享库以.so作为后缀名,共享库只有一个副本。

在CMakeLists.txt中添加add_library(hello_shared SHARED libHello.cpp),此时得到的文件就是libhello_shared.so

4、添加头文件

为了让别人或自己使用这个库,我们需要提供一个头文件,说明这些库里面都有些什么。
因此,对于库的使用者,只要拿到了头文件和库文件,就可以调用这个库。

完整程序demo

  • libHello.cpp

    //这是一个库文件
    #include <iostream>
    using namespace std;
    
    void printHello(){
    	cout << "Hello !" << endl;
    }
    
  • libHello.h

    #ifndef LIBHELLO_H_
    #define LIBHELLO_H_
    
    // 打印一句Hello的函数
    void printHello();
    
    #endif
    
  • main.cpp

    #include "libHello.h"
    
    int main(int argc, char **argv)
    {
        printHello();
        return 0;
    }
    
  • CMakeLists.txt

    # 声明要求的cmake最低版本
    cmake_minimum_required(VERSION 2.8)
    
    # 声明一个 cmake 工程
    project(Hello)
    
    # 设置编译模式
    set(CMAKE_BUILD_TYPE "Debug")
    
    # 添加一个可执行程序
    # 语法:add_executable( 程序名 源代码文件 )
    add_executable(hellotest hello.cpp)
    
    # 添加hello库
    add_library(hello libHello.cpp)
    # 共享库
    add_library(hello_shared SHARED libHello.cpp)
    
    # 添加可执行程序调用hello库中函数
    add_executable(useHello main.cpp)
    # 将库文件链接到可执行程序上
    target_link_libraries(useHello hello_shared)
    

OpenCV 中的cmake学习使用

记录的一段CMakeLists.txt

cmake_minimum_required (VERSION 3.0)

PROJECT(Chapter2)

set (CMAKE_CXX_STANDARD 11)

IF(EXISTS ${CMAKE_BINARY_DIR}/conanbuildinfo.cmake)
    include(${CMAKE_BINARY_DIR}/conanbuildinfo.cmake)
    conan_basic_setup()
ENDIF()

# Requires OpenCV
FIND_PACKAGE( OpenCV 4.0.0 REQUIRED )
MESSAGE("OpenCV version : ${OpenCV_VERSION}")

ADD_EXECUTABLE( sample1 sample1.cpp )
TARGET_LINK_LIBRARIES( sample1 ${OpenCV_LIBS} ${CONAN_LIBS} ) 


ADD_EXECUTABLE( sample2 sample2.cpp )
TARGET_LINK_LIBRARIES( sample2 ${OpenCV_LIBS} ${CONAN_LIBS} )

ADD_EXECUTABLE( sample3 sample3.cpp )
TARGET_LINK_LIBRARIES( sample3 ${OpenCV_LIBS} ${CONAN_LIBS} )

ADD_EXECUTABLE( ${PROJECT_NAME} main.cpp )
TARGET_LINK_LIBRARIES( ${PROJECT_NAME} ${OpenCV_LIBS} ${CONAN_LIBS} )

cmake代码解读的记录

# Requires OpenCV
	FIND_PACKAGE( OpenCV 4.0.0 REQUIRED )
# Show a message with the opencv version detected
	MESSAGE("OpenCV version : ${OpenCV_VERSION}")
	include_directories(${OpenCV_INCLUDE_DIRS})
	link_directories(${OpenCV_LIB_DIR})
  • 这段代码搜索OpenCV依赖项,FIND_PACKAGE能够查找依赖项、所需的最低版本以及该依赖是必须还是可选的。此例中我们查找4.0.0或更高版本的opencv,并声明它是必需包。

  • ${OpenCV_VERSION}是CMake用来存储OpenCV包版本的变量。

  • OpenCV CMake 的模块将这些数据保存在${OpenCV_INCLUDE_DIRS}和${OpenCV_LIB_DIR}变量中,并非所有的平台都需要这些命令行,因为这些路径通常位于环境中。

包含我们开发的源文件

# Create a variable called SRC
	SET(SRC main.cpp)
# Create our executable
	ADD_EXECUTABLE(${PROJECT_NAME} ${SRC})
# Link our library
	TARGET_LINK_LIBRARIES(${PROJECT_NAME} ${OpenCV_LIBS})

这边的意思是用SRC这个变量来代替main.cpp,下次要使用main.cpp的使用就可以用SRC 这个参数了。

标签:cmake,记录,OpenCV,add,cmke,cpp,hello,LIBS
来源: https://www.cnblogs.com/Balcher/p/16411002.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有