zoukankan      html  css  js  c++  java
  • 一步一步学CMake 之 生成动态库和静态库

    目录

    1. 准备源文件

    2. 创建目标库文件

    3. 链接库文件

    4. 静态库和共享库的区别


    1. 准备源文件

    包含:

    1.  
      CMakeLists.txt
    2.  
      Message.cpp
    3.  
      Message.hpp
    4.  
      hello-world.cpp

    详见:

    https://github.com/dev-cafe/cmake-cookbook/tree/master/chapter-01/recipe-03/cxx-objlib-example

    2. 创建目标库文件

    这次我们要将 Message.cpp 和 Message.hpp 这两个文件编译成一个静态库文件,而不是可执行文件,

    更改CMakeLists.txt文件,创建一个新的目标文件:

    1.  
      add_library(message
    2.  
         STATIC
    3.  
         Message.hpp
    4.  
         Message.cpp
    5.  
      )

    该命令会生成构建工具指令,用于将指定的源文件编译为库文件,第一个参数 message 是将要生成的库文件的名字,该库名可以在整个CMakeLists.txt中使用,而实际生成的库文件名字则会包含前缀(lib)和后缀,后缀取决于第二个参数是STATIC还是SHARED,还取决于操作系统。

    命令详解见:add_library

    3. 链接库文件

    告诉CMake必须把库文件链接到可执行文件里

    target_link_libraries(hello-world message)

    该命令是将库文件链接到可执行文件里,这条命令能保证hello-world可执行文件能够正确地一来于 message库文件(库文件总是在可执行文件之前构建的)。

    4. 静态库和共享库

    下面命令中第二个参数STATIC是指生成静态库,如果要生成共享库,可以直接将其替换为SHARED关键词。

    1.  
      add_library(message STATIC Message.hpp Message.cpp)
    2.  
      add_library(message SHARED Message.hpp Message.cpp)

    这里顺便简单提一下静态(函数)库和共享(函数)库的区别:

    静态(函数)库是在程序编译时链接的,其实就是一个或多个目标文件的集合,用“.a”作为文件的后缀。

    共享(函数)库中的函数是在当一个可执行程序在启动的时候被加载,共享(函数)库又叫动态(函数)库, 文件后缀是.so ,windows上叫动态加载函数库, 文件后缀是.dll

    1.  
      # set minimum cmake version
    2.  
      cmake_minimum_required(VERSION 3.5 FATAL_ERROR)
    3.  
       
    4.  
      # project name and language
    5.  
      project(recipe-03 LANGUAGES CXX)
    6.  
       
    7.  
      # generate an object library from sources
    8.  
      add_library(message-objs
    9.  
      OBJECT
    10.  
      Message.hpp
    11.  
      Message.cpp
    12.  
      )
    13.  
       
    14.  
      # this is only needed for older compilers
    15.  
      # but doesn't hurt either to have it
    16.  
      set_target_properties(message-objs
    17.  
      PROPERTIES
    18.  
      POSITION_INDEPENDENT_CODE 1
    19.  
      )
    20.  
       
    21.  
      add_library(message-shared
    22.  
      SHARED
    23.  
      $<TARGET_OBJECTS:message-objs>
    24.  
      )
    25.  
      set_target_properties(message-shared
    26.  
      PROPERTIES
    27.  
      OUTPUT_NAME "message"
    28.  
      )
    29.  
       
    30.  
      add_library(message-static
    31.  
      STATIC
    32.  
      $<TARGET_OBJECTS:message-objs>
    33.  
      )
    34.  
      set_target_properties(message-static
    35.  
      PROPERTIES
    36.  
      OUTPUT_NAME "message"
    37.  
      )
    38.  
       
    39.  
      add_executable(hello-world hello-world.cpp)
    40.  
       
    41.  
      target_link_libraries(hello-world message-static)
  • 相关阅读:
    彩食鲜架构团队风采
    钉钉的sonar集成通知
    django学习,session与cookie
    flask框架
    logging日志从开始到放弃
    你这么年轻,总得做些什么吧(致那些还未定型的程序员)
    悲观锁,乐观锁
    商城中的猜你喜欢是怎么实现的
    MemCache与redis
    如何使用go打出hell word
  • 原文地址:https://www.cnblogs.com/lidabo/p/13846916.html
Copyright © 2011-2022 走看看