在作《劍指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
?
?
?