【cmke】cmake相关的记录

 


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

单文件的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 的模块将这些数据保存在OpenCVINCLUDEDIRS{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 这个参数了。

posted @   乞力马扎罗山的雪  阅读(78)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
点击右上角即可分享
微信分享提示

目录导航