静态库和动态库的区别
-
静态库的扩展名一般为“.a”或“.lib”;动态库的扩展名一般为“.so”或“.dll”。
-
静态库在编译时会直接整合到目标程序中,编译成功的可执行文件可独立运行
-
动态库在编译时不会放到连接的目标程序中,即可执行文件无法单独运行
1.构建工程目录实例
2.工程文件编写与安装
3.使用.so和.a
1.工程实例目录:
编译与运行
cd build #到build下
cmake .. #生成makefile
make #生成make /bin/libhello.so
rm -rf * #清除build下的所有文件
cmake ..
make
cd bin # 到build/bin下可以查看到文件
rm -rf *
cmake -D CMAKE_INSTALL_PREFIX=/usr .. #指定安装路径
make
make install
2.工程文件编写与安装
hello.h
#ifndef HELLO_H
#define Hello_H
void HelloFunc();
#endif
hello.cpp
#include "hello.h"
#include <iostream>
void HelloFunc(){
std::cout << "Hello World" << std::endl;
}
项目中的CMakeLists.txt
PROJECT(HELLO)
ADD_SUBDIRECTORY(lib bin)
lib中的CMakeLists.txt
SET(LIBHELLO_SRC hello.cpp)
#ADD_LIBRARY(hello SHARED ${LIBHELLO_SRC})
# hello:动态库名字 libhello.so
# SHARED:动态库 STATIC:静态库
# ${LIBHELLO_SRC}:源文件 hello.cpp
ADD_LIBRARY(hello_static STATIC ${LIBHELLO_SRC})
SET_TARGET_PROPERTIES(hello_static PROPERTIES OUTPUT_NAME "hello")
SET_TARGET_PROPERTIES(hello_static PROPERTIES CLEAN_DIRECT_OUTPUT 1)
#清理掉其它使用这个名字的库
ADD_LIBRARY(hello SHARED ${LIBHELLO_SRC})
SET_TARGET_PROPERTIES(hello PROPERTIES OUTPUT_NAME "hello")
SET_TARGET_PROPERTIES(hello PROPERTIES CLEAN_DIRECT_OUTPUT 1)
#清理掉其它使用这个名字的库
#安装文件
INSTALL(FILES hello.h DESTINATION include/hello)
INSTALL(TARGETS hello hello_static LIBRARY DESTINATION lib ARCHIVE DESTINATION lib)
# 动态库 静态库
#LIBRARY: 动态库关键字 DESTINATION: 动态库安装位置 lib
#ARCHIVE: 静态库关键字 DESTINATION:静态库安装位置 lib
3.使用.so和.a
hello.h 在 /usr/include/hello/hello.h
3.1工程构建
mkdir cmake03
cd cmake03
mkdir build
touch CMakeLists.txt
mkdir src
cd src
touch CMakeLists.txt
cd build
mv /usr/lib/libhello.so /usr/lib64/
cmake ..
make
cd bin #build/bin 下生成了hello
./hello #在bin 目录下执行
3.2工程文件
main.cpp
#include <hello.h>
int main(){
HelloFunc();
}
根目录下的CMakeLists.txt
PROJECT(HELLO)
ADD_SUBDIRECTORY(src bin)
src目录下的CMakeLists.txt
INCLUDE_DIRECTORIES(/usr/include/hello) #头文件的搜索路径
ADD_EXECUTABLE(hello main.cpp)
TARGET_LINK_LIBRARIES(hello libhello.a) #hello 是二进制文件的名字
引用函数:
1.LINK_DIRECTORIES(/home/myproject/libs) #指定绝对路径
2.TARGET_LINK_LIBRARIES(hello libhello.so) #系统环境变量下 直接写名字即可