Linux系統動態鏈接庫和靜態鏈接庫CMake的使用方法

Linux系統動態鏈接庫和靜態鏈接庫CMake的使用方法


基於2016華爲精英挑戰賽第三方庫使用方法的總結

在尋找過特定子集點的最小路徑問題,在數學上可以表示爲求解滿足約束問題的整數規劃問題,求解整數規劃問題高效率的第三方庫可供使用,如lpsolve、glpk,lingo等。以下介紹基於lpsolve庫的應用。lpsolve的使用將會單獨介紹。

lpsolve簡介

lp_solve庫版權爲LGPL.

Lesser General Public Licence,LGPL允許商業軟件通過類庫引用(link)方式使用LGPL類庫而不需要開源商業軟件的代碼,這使得采用LGPL協議的開源代碼可以被商業軟件作爲類庫引用併發布和銷售。適合那些用於非 GPL 或非開源產品的開源類庫或框架。
GPL/LGPL都保障原作者的知識產權,避免有人利用開源代碼複製並開發類似的產品。
規則條款:
  如果修改LGPL協議的代碼或者衍生,則所有修改的代碼,涉及修改部分的額外代碼和衍生的代碼都必須採用LGPL協議。(引用或修改LGPL的代碼及其衍生也必須使用LGPL開源,源於閉源的代碼不需要開源)。
因此LGPL協議的開源代碼很適合作爲第三方類庫被商業軟件直接引用,但不適合希望以開源代碼爲基礎,通過修改和衍生的方式做二次開發的商業軟件採用。

lpsolve 可以求解線性規劃,整數規劃,混合整數規劃等優化問題。
lpsolve有Windows,Linux。ios,MATLAB等環境下的版本。
linux版本有以下文件
這裏寫圖片描述
其中.a文件是靜態鏈接庫文件,.so是動態庫鏈接文件
靜態庫名稱一般爲xxx.a,在編譯時和應用程序鏈接在一起,這樣的應用程序佔用空間較大,但是可以在任意臺電腦上使用,而不必擔心電腦上是否有庫的存在。
動態庫名稱一般爲xxx.so,對於動態庫即可以在編譯時鏈接,也可以使用dlopen()/dlsym()/dlclose()函數在運行時調用,後種方式佔用空間較小,且可以實現動態庫在進程間共享,只在內存中保留一份,減少了內存開銷。

Linux系統使用主要在與Cmake文件的使用,當然也可以手動編譯。

#CMakeLists.txt
# CMake 最低版本號要求
cmake_minimum_required(VERSION 2.8)

# 項目信息
project(future_net)

# include路徑
include_directories(${PROJECT_SOURCE_DIR}/lib)

# 把 第三方 庫 的 .a 文件和 .h 文件放到 代碼的 lib 文件夾
link_directories(${PROJECT_SOURCE_DIR}/lib)

# 設置可執行文件生成路徑
set(EXECUTABLE_OUTPUT_PATH ${PROJECT_BINARY_DIR}/../bin)

# 生成debug版本
SET(CMAKE_BUILD_TYPE "Release") 
SET(CMAKE_CXX_FLAGS_DEBUG "$ENV{CXXFLAGS} -O0 -Wall -g -ggdb")
SET(CMAKE_CXX_FLAGS_RELEASE "$ENV{CXXFLAGS} -O3 -Wall")

# 查找當前目錄下的所有源文件
# 並將名稱保存到 DIR_LIB_SRCS 變量
aux_source_directory(. DIR_SRCS)

# 指定生成目標 
add_executable(future_net ${DIR_SRCS})

#下面的 libxxx 是 第三方庫 的名字:
target_link_libraries(future_net libxxx)
# 其他系統庫,如果鏈接失敗也一起鏈接:
TARGET_LINK_LIBRARIES(future_net dl)
TARGET_LINK_LIBRARIES(future_net pthread)

華爲提供了一鍵式編譯、鏈接、打包的執行腳本batch.sh,只需要在路徑下執行 sh batch.sh 即可
這裏寫圖片描述
只需要將lpsolve提供的庫文件放在lib下,修改cmakelists.txt即可運行程序。

#batch.sh
#!/bin/bash

SCRIPT=$(readlink -f "$0")
BASEDIR=$(dirname "$SCRIPT")
cd $BASEDIR

if [ ! -d future_net ] || [ ! -f readme.txt ]
then
    echo "ERROR: $BASEDIR is not a valid directory of SDK-gcc for future_net."
    echo "  Please run this script in a regular directory of SDK-gcc."
    exit -1
fi

tmp=$(cmake --version 2>&1)
if [ $? -ne 0 ]
then
    echo "ERROR: You should install cmake(2.8 or later) first."
    echo "  Please run 'sudo at-get install cmake' to install it."
    echo "  or goto https://cmake.org to download and install it."
    exit
fi

rm -fr bin
mkdir bin
rm -fr build
mkdir build
cd build
cmake ../future_net
make 

cd ..
cp -r future_net bin/code
cd bin
tar -zcPf future_net.tar.gz *
cp future_net.tar.gz ../
rm -rf code
rm -f future_net.tar.gz
cd ..
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章