CMake编译静态库
准备工作
- 安装cmake 我的系统是ubuntu16,这一步就不赘述了,apt或者源代码安装都没问题。
源代码 我是想在系统中学习好linux应用层编程,所以我买了Linux/Uinx系统编程手册。 在学习过程中发现他的代码都依赖于作者所写的几个头文件,所以我产生了将其将其编译成静态库的想法,虽然文件不多,但是姑且也算是学习到了一些东西。需要的可以自行百度搜索下载。 源代码分布如下:
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
CMAKE_MINIMUM_REQUIRED(VERSION 2.8)
PROJECT(TestLIB) #工程名
ADD_SUBDIRECTORY(lib) #添加子目录编译
查看结果cd build/
cmake ..
make现在生成了静态库libtpli.a。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测试
准备 新建了一个目录test,将头文件加入其中,内容如下
test.c(复制文件内容到另一个文件):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/*************************************************************************\
* 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].
*/
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_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)# 连接静态库库编译
cd build/
cmake ..
make运行
./Tutorial
Usage: ./Tutorial old-file new-file
cat 1.txt
编译静态库成功
./Tutorial 1.txt 2.txt
cat 2.txt
编译静态库成功