Linux系统动态链接库和静态链接库CMake的使用方法

时间:2022-07-25 15:52:30

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版本有以下文件
Linux系统动态链接库和静态链接库CMake的使用方法
其中.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 即可
Linux系统动态链接库和静态链接库CMake的使用方法
只需要将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 ..