一:动态库
接下来我们简单的讲解下动态库的建立和使用:在后面的项目的开发过程中,我们使用第三方库或者我们跑这个项目的时候我们总会看到一些.so的文件,这些就是所谓的动态库,里面的内容就是编译后的源文件,是程序运行时被加载和链接的代码库。并且可以独立更新,且因为可以被多个程序共享同一个动态库,所以动态库也被成为共享库。
还是那个例子,我们直接把cpp文件编译成.so文件:
#行注释
#[[块注
释]]
cmake_minimum_required(VERSION 3.0)#指定最低cmake版本的命令
project("cmake_learn")#定义工程名称
#--------------------------------------------------------------------------------
# aux_source_directory(src SRC_LIST)
file(GLOB_RECURSE SRC_LIST
"src/*.cpp"
)
include_directories(./include)
message("SRC_LIST is " ${SRC_LIST})
#生成静态库/动态库
add_library(MyShare SHARED ${SRC_LIST})
#通过set函数设置编译器的版本
set(CMAKE_CXX_STANDARD 11)#增加c++11的标准 CMAKE_CXX_STANDARD是内置变量 所以可以在cmake的时候直接通过参数进行指定 cmake /path/to/cmakelists.txt -DCMAKE_CXX_STANDARD=11
我们借用上一节提到的file方式找到所有的源文件后,将源文件通过add_library来生成一个动态库名字为MyShare。
# PUBLIC:在public后面的库会被Link到前面的target中,并且里面的符号也会被导出,提供给第三方使用
# PRIVATE:在private后面链接的库只能被link前面的库中,并且被终结。第三方不能感知你调用啥库
# INTERFACE:在interface后面引入的库不会被链接到前面的库中,只会导出符号
#动态库的链接具体传递性
# 如果各个动态库之间没有依赖的关系,无需做任何设置,PUBLIC,PRIVATE,INTRERFACE没有啥区别,一般使用默认的PUBLIC即可。
#如果动态库A链接了动态库B,C动态库D链接了动态库A,此时动态库D相当于也链接了动态库B,并可以使用动态库B,C中定义的方法。
# target_link_libraries(A B C)
# target_link_libraries(D A)
当我们编译了一个动态库之后我们可以尝试链接动态库,在次之前,我们可以把除了main.cpp之外的源文件都删除。
#行注释
#[[块注
释]]
cmake_minimum_required(VERSION 3.0)#指定最低cmake版本的命令
project("cmake_learn")#定义工程名称
#--------------------------------------------------------------------------------
# aux_source_directory(src SRC_LIST)
file(GLOB_RECURSE SRC_LIST
"src/*.cpp"
)
include_directories(./include)
message("SRC_LIST is " ${SRC_LIST})
#生成静态库/动态库
# add_library(MyShare SHARED ${SRC_LIST})
#链接动态库的路径
link_directories(./build/)
link_libraries(MyShare)
add_executable(MyShare_lession2 ./main.cpp)#定义工程生成一个可执行文件
target_link_libraries(MyShare_lession2 PRIVATE MyShare)
#通过set函数设置编译器的版本
set(CMAKE_CXX_STANDARD 11)#增加c++11的标准 CMAKE_CXX_STANDARD是内置变量 所以可以在cmake的时候直接通过参数进行指定 cmake /path/to/cmakelists.txt -DCMAKE_CXX_STANDARD=11
这样我们就能编译并且链接上动态库了。
二:静态库
在动态库中我们使用add_library(MyShare SHARED ${SRC_LIST})来生成动态库,那么我们把SHARED替换成STATIC就是生成静态库了。ok,我们试试:
#行注释
#[[块注
释]]
cmake_minimum_required(VERSION 3.0)#指定最低cmake版本的命令
project("cmake_learn")#定义工程名称
#--------------------------------------------------------------------------------
# aux_source_directory(src SRC_LIST)
file(GLOB_RECURSE SRC_LIST
"src/*.cpp"
)
include_directories(./include)
message("SRC_LIST is " ${SRC_LIST})
#生成静态库/动态库
add_library(MyStatic STATIC ${SRC_LIST})
#通过set函数设置编译器的版本
set(CMAKE_CXX_STANDARD 11)#增加c++11的标准 CMAKE_CXX_STANDARD是内置变量 所以可以在cmake的时候直接通过参数进行指定 cmake /path/to/cmakelists.txt -DCMAKE_CXX_STANDARD=11
执行编译后,我们发现build目录下多了一个libMyStatic.a文件,这个.a的文件就是静态库。那么同样的,我们链接/使用静态库的方式也和动态库一样,只是库的名称和方式不一样:
#行注释
#[[块注
释]]
cmake_minimum_required(VERSION 3.0)#指定最低cmake版本的命令
project("cmake_learn")#定义工程名称
#--------------------------------------------------------------------------------
# aux_source_directory(src SRC_LIST)
file(GLOB_RECURSE SRC_LIST
"src/*.cpp"
)
include_directories(./include)
message("SRC_LIST is " ${SRC_LIST})
link_directories(./build/)
link_libraries(MyStatic)
add_executable(MyStatic_lession2 ./main.cpp)
target_link_directories(MyStatic_lession2 PRIVATE MyStatic)
#通过set函数设置编译器的版本
set(CMAKE_CXX_STANDARD 11)#增加c++11的标准 CMAKE_CXX_STANDARD是内置变量 所以可以在cmake的时候直接通过参数进行指定 cmake /path/to/cmakelists.txt -DCMAKE_CXX_STANDARD=11
按上述内容写完cmakelists.txt后,执行cmake 最后会生成一个MyStatic_lession2 可执行文件,执行即可。