CMake编译静态库

CMake编译静态库


准备工作

  • 安装cmake
     我的系统是ubuntu16,这一步就不赘述了,apt或者源代码安装都没问题。
  • 源代码
     我是想在系统中学习好linux应用层编程,所以我买了Linux/Uinx系统编程手册
    在学习过程中发现他的代码都依赖于作者所写的几个头文件,所以我产生了将其将其编译成静态库的想法,虽然文件不多,但是姑且也算是学习到了一些东西。需要的可以自行百度搜索下载。
     源代码分布如下:
    ```sh
    zqh@linux:~/system_program$ tree .
    .
    ├── build
    ├── CMakeLists.txt
    ├── lib
    │ ├── alt_functions.c
    │ ├── alt_functions.h
    │ ├── CMakeLists.txt
    │ ├── ename.c.inc
    │ ├── error_functions.c
    │ ├── error_functions.h
    │ ├── get_num.c
    │ ├── get_num.h
    │ └── tlpi_hdr.h
    └── 编译静态库.md

    2 directories, 11 files
    ```
  • 编写CMakeLists
    • lib目录下的CMakeLists
    CMAKE_MINIMUM_REQUIRED(VERSION 2.8)  
    
    SET(LIB_SRC alt_functions.c error_functions.c get_num.c)  #添加源文件
    
    #添加静态库  
    ADD_LIBRARY(tpli_static STATIC ${LIB_SRC})  
    
    #将静态库重新命名为Libtpli
    SET_TARGET_PROPERTIES(tpli_static PROPERTIES OUTPUT_NAME "tpli")
    • 当前目录下的CMakeLists
    CMAKE_MINIMUM_REQUIRED(VERSION 2.8)  
    PROJECT(TestLIB)  #工程名
    ADD_SUBDIRECTORY(lib) #添加子目录
  • 编译
    sh cd build/ cmake .. make
    查看结果
    sh zqh@linux:~/system_program/build$ ls CMakeCache.txt CMakeFiles cmake_install.cmake lib Makefile zqh@linux:~/system_program/build$ cd lib/ zqh@linux:~/system_program/build/lib$ ls CMakeFiles cmake_install.cmake libtpli.a Makefile
    现在生成了静态库libtpli.a。
  • 测试
    • 准备
      新建了一个目录test,将头文件加入其中,内容如下
      ```sh
      zqh@linux:~/system_program/test$ tree
      .
      ├── build
      ├── CMakeLists.txt
      ├── inc
      │ ├── alt_functions.h
      │ ├── ename.c.inc
      │ ├── error_functions.h
      │ ├── get_num.h
      │ └── tlpi_hdr.h
      └── test.c

      2 directories, 7 files
      test.c(复制文件内容到另一个文件):c
      /************************************************************************* * Copyright (C) Michael Kerrisk, 2017. *
      •                                                                     *
      • This program is free software. You may use, modify, and redistribute it *
      • under the terms of the GNU General Public License as published by the *
      • Free Software Foundation, either version 3 or (at your option) any *
      • later version. This program is distributed without any warranty. See *
      • the file COPYING.gpl-v3 for details.
        *
        ***********************************************************************/

      /* Listing 4-1 */

      /* copy.c

      Copy the file named argv[1] to a new file named in argv[2].
      */
      #include <sys/stat.h>
      #include <fcntl.h>
      #include "tlpi_hdr.h"

      #ifndef BUF_SIZE /* Allow "cc -D" to override definition */
      #define BUF_SIZE 1024
      #endif

      int
      main(int argc, char *argv[])
      {
      int inputFd, outputFd, openFlags;
      mode_t filePerms;
      ssize_t numRead;
      char buf[BUF_SIZE];

        if (argc != 3 || strcmp(argv[1], "--help") == 0)
            usageErr("%s old-file new-file\n", argv[0]);
      
        /* Open input and output files */
      
        inputFd = open(argv[1], O_RDONLY);
        if (inputFd == -1)
            errExit("opening file %s", argv[1]);
      
        openFlags = O_CREAT | O_WRONLY | O_TRUNC;
        filePerms = S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP |
                    S_IROTH | S_IWOTH;      /* rw-rw-rw- */
        outputFd = open(argv[2], openFlags, filePerms);
        if (outputFd == -1)
            errExit("opening file %s", argv[2]);
      
        /* Transfer data until we encounter end of input or an error */
      
        while ((numRead = read(inputFd, buf, BUF_SIZE)) > 0)
            if (write(outputFd, buf, numRead) != numRead)
                fatal("couldn't write whole buffer");
        if (numRead == -1)
            errExit("read");
      
        if (close(inputFd) == -1)
            errExit("close input");
        if (close(outputFd) == -1)
            errExit("close output");
      
        exit(EXIT_SUCCESS);

      }
      CMakeLists.txt:cmake
      CMAKE_MINIMUM_REQUIRED(VERSION 2.8)
      project (Tutorial) #工程名

      # 添加头文件目录
      include_directories(${PROJECT_SOURCE_DIR}/inc )

      link_libraries(/home/zqh/system_program/build/lib/libtpli.a)#添加静态库

      add_executable (Tutorial test.c) #创建可执行文件

      target_link_libraries(Tutorial /home/zqh/system_program/build/lib/libtpli.a)# 连接静态库库
      ```
    • 编译
      sh cd build/ cmake .. make
    • 运行
      sh ./Tutorial Usage: ./Tutorial old-file new-file cat 1.txt 编译静态库成功 ./Tutorial 1.txt 2.txt cat 2.txt 编译静态库成功

转载于:https://www.cnblogs.com/ZQQH/p/8999352.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在使用CMake编译静态库时,可以使用add_library函数来定义库的名称和源文件。在add_library函数中,可以通过第二个参数来指定库的类型,使用STATIC表示静态库。例如,使用add_library(xlog STATIC xlog.cpp)可以编译一个名为xlog的静态库。\[2\]然后,使用CMake的外部构建方法,可以在build/lib目录中生成静态库libadd.a。首先创建一个build目录,然后进入该目录,运行cmake命令来生成构建文件,最后使用make命令进行编译。具体的命令如下所示: $ mkdir build $ cd build $ cmake .. $ make\[3\] #### 引用[.reference_title] - *1* [CMake构建静态库与动态库以及使用](https://blog.csdn.net/Long_xu/article/details/129139244)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insert_down28v1,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [cmake add_library编译链接静态库cmakelists](https://blog.csdn.net/jiedichina/article/details/126687785)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insert_down28v1,239^v3^insert_chatgpt"}} ] [.reference_item] - *3* [CMake 学习四:CMake 构建静态库和动态库](https://blog.csdn.net/myw31415926/article/details/128508447)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insert_down28v1,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值