有时候,通过C++编写的代码并不一定是直接在自己的控制台文件调用,而是需要在其他程序中调用编写的算法的接口即可。这个时候,可以把自己编写的代码打包成一个库(Library),编译后被其他程序调用。库一般是许多算法和程序的集合。
本文记录库文件和头文件编写过程。
本文通过clion来创建项目,可以在创建项目的时候选择自己的库文件是共享链接库或者静态链接库。
静态库:静态库每次调用时都会生成一个副本,比较占空间。
共享库:在多次调用时只会产生一个副本,节省空间,生成共享库的方法是在CMakeList.txt文件中加入以下指令:
#该指令语法格式:add_library( 程序名 源代码文件 )
add_library( hello_shared SHARED libHelloWorld.cpp )
即关键字SHARED
cmake_minimum_required(VERSION 3.24)
project(LibraryCodeLearn)
set(CMAKE_CXX_STANDARD 17)
add_library(LibraryCodeLearn SHARED library.cpp)
cmake_minimum_required
告诉计算机要编译CMakeList.txt的最小CMake版本。
project
则表明项目名
set(CMAKE_CXX_STANDARD 17)
设置编译器的C++标准,当前项目使用的是C17标准。
要引入第三方库,首先要下载好第三方库的源代码。并放在项目指定的目录下。
以引入OpenCV库为例,从OpenCV的官网(https://opencv.org/)下载好源代码。并将其解压到项目指定的目录,或是某个集中配置的目录。
通过添加以下代码到CMakeList.txt中引入OpenCV
#引入OpenCV
set(OpenCV_DIR opencv/build)
find_package(OpenCV REQUIRED)
include_directories(${OpenCV_INCLUDE_DIRS})
add_library(LibraryCodeLearn SHARED library.cpp)
target_link_libraries(ProgramName ${OpenCV_LIBS})
set(OpenCV_DIR opencv/build)
制定了OpenCV的build目录,find_package(OpenCV REQUIRED)
指定程序需要先找到OpenCV库,REQUIRED
要求程序必须找到该库,否则会报编译错误。include_directories(${OpenCV_INCLUDE_DIRS})
将OpenCV库的头文件目录包括进来,target_link_libraries(ProgramName ${OpenCV_LIBS})
指定链接到的库
头文件是C、C++程序中重要的组成部分,通常会将.h头文件和.cpp文件放在不同的文件夹,常见的储存方式是.h文件放在include中,.cpp文件放置在src文件中。
在include文件下,新建一个libHelloWorld.h文件。clion会生成一些内容
#ifndef UNTITLED_LIBHELLOWORLD_H
#define UNTITLED_LIBHELLOWORLD_H
//进行宏定义是为了防止重复引用头文件而引起重定义错误
#endif //UNTITLED_LIBHELLOWORLD_H
该宏定义过程为
#ifndef 大写头文件名_H
#define 大写头文件名_H
#endif
可以向对应的.cpp文件中写入函数,并在头文件中声明。
.cpp文件中代码如下
#include
using namespace std;
void printHello()
{
cout << "Hello world!"<< endl;
}
并在对应的头文件中声明
#ifndef UNTITLED_LIBHELLOWORLD_H
#define UNTITLED_LIBHELLOWORLD_H
void printHello();
#endif //UNTITLED_LIBHELLOWORLD_H
通过编译,即可生成动态链接库.so文件。