在作《剑指offer》中的单向链表的题目时,需要一些常用到的操作链表的函数放在一个文件下,我想把这些函数的声明都写在list.h文件中,把这些函数的定义都写在list.cpp文件中,这样就可以在测试文件test.cpp中调用list.cpp中定义的函数,或者我还想把有关l链表操作的函数封装成一个库,安装到电脑中,这个库可以被外部程序调用。
首先看一下动态链接库和静态链接库分别是什么
动态链接库是以.so结尾的文件,静态链接库是以.a结尾的文件。
一种是LIB包含了函数所在的DLL文件和文件中函数位置的信息(入口),代码由运行时加载在进程空间中的DLL提供,称为动态链接库dynamic link library。
一种是LIB包含函数代码本身,在编译时直接将代码加入程序当中,称为静态链接库static link library。
(所以无论是动态链接库还是静态链接库,都会有lib文件)
1.首先是安装链接库
cmake是一个编程项目管理工具。
首先在你的工程目录下创建 list.cpp,list.h, CMakeLists.txt文件,并创建一个lib文件夹来盛放生成的链接库
然后是在CMakeLists.txt文件中添加如下语句
cmake_minimum_required(VERSION 3.5)
project(lib)
set(LIB_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/lib)
set(CMAKE_CXX_STANDARD 11)
set(LIST_SRC list.cpp)
ADD_LIBRARY(list SHARED ${LIST_SRC})
ADD_LIBRARY(list_static STATIC ${LIST_SRC})
INSTALL(TARGET list list_static LIBRARY DESTINATION lib ARCHIVE DESTINATION lib)
INSTALL(FILES list.h DESTINATION include/list)
然后在终端操作安装动态和静态链接库
mkdir build
cd build
cmake DCMAKE_INSTALL_PREFIX=/usr ../
make
sudo make install
如果安装成功,那么就会显示如下信息
--install configuration
--installing: /usr/local/lib/liblist.so
--installing: /usr/local/lib/liblist.a
--Up-to-date: /usr/local/include/list/list/h
2.外部程序使用安装好的动态链接库
在一个新的工程目录下,你创建了test.cpp, CMakeLists.txt文件,在CMakeList.txt文件中写入如下语句
cmake_minimum_required(VERSION 3.5)
project(ListWithDynamic)
set(CMAKE_CXX_STANDARD 11)
include_directories(/usr/local/include/list)
add_executable(ListWithDynamic test.cpp)
target_link_libraries(ListWithDynamic /usr/local/lib/liblist.so)
对于这种我们自己编写安装的链接库,我们在使用的时候首先需要将链接库的头文件包含进来,就是这里的include_directories()函数实现这个功能,然后还需要将目标文件,就是这里的ListWithDynamic链接到liblist.so上,就是这里的target_link_libraries()函数实现这个功能,如果没有这个函数,编辑器会提示错误,“undefined reference to 'CreateListNode'”
3.使用下载安装的第三方库和使用自己编写安装的库的一个在CMakeLists.txt的明显不同是
请查看另一篇文章https://mp.csdn.net/postedit/82380445