CMakeLists.txt语法(三)
一.生成动态库或者静态库步骤
1.创建工程目录
/home/a/testLIB
2.工程目录下创建CMakeLists.txt
PROJECT(testlib)
ADD_SUBDIRECTORY(srcLIB)
3.工程目录下创建子目录
/home/a/testLIB/srcLIB
4.子目录srcLIB下的文件
(1)testlib.h
#ifndef TEST_LIB_H
#define TEST_LIB_H#include<stdio.h>
void printFunc();#endif
(2)testlib.c
#include "testlib.h"
void printFunc()
{printf("this is printFunc test\n");
}
(3)CMakeLists.txt
- 生成动态库libtest.so
SET(testLIB_SRC testlib.c)
SET(LIBRARY_OUTPUT_PATH ${PROJECT_BINARY_DIR}/lib)
ADD_LIBRARY(test SHARED ${testLIB_SRC})
- 生成静态库libtest.a
SET(testLIB_SRC testlib.c)
SET(LIBRARY_OUTPUT_PATH ${PROJECT_BINARY_DIR}/lib)
ADD_LIBRARY(test STATIC ${testLIB_SRC})
5.编译
工程目录下创建build目录,使用外部编译,进入build目录执行:
cmake ..
make
例如:生成动态库libtest.so
二.语法
指令ADD_LIBRARY(libname [SHARED|STATIC] source1 source2 … sourceN)
生成的库类型:
(1)动态库:SHARED
(2)静态库:STATIC
三.同时创建动态库和静态库
上述指令无法同时生成同名的动态库(libtest.so)和静态库(libtest.a)
需要使用set_target_properties指令
1.set_target_properties语法
set_target_properties(target1 target2 …
PROPERTIES prop1 value1
[prop2 value2 …])
- target1, target2, …: 要设置属性的目标名,可以是可执行目标、静态库或共享库。
- PROPERTIES: 关键字,指定后面是要设置的属性列表。
- prop1 value1, prop2 value2, …: 属性名和对应的值,可以设置多个属性。
常见的目标属性
在 CMake 中,可以设置的目标属性非常多,具体取决于目标的类型和使用场景。一些常见的目标属性包括:
OUTPUT_NAME: 设置输出文件的名称。
RUNTIME_OUTPUT_DIRECTORY: 设置运行时输出目录。
ARCHIVE_OUTPUT_DIRECTORY: 设置静态库输出目录。
LIBRARY_OUTPUT_DIRECTORY: 设置共享库输出目录。
COMPILE_OPTIONS: 设置编译选项。
CXX_STANDARD, CXX_STANDARD_REQUIRED: 设置 C++ 标准和是否要求严格遵循。
2.子目录下的CMakeLists.txt
SET(testLIB_SRC testlib.c)
SET(LIBRARY_OUTPUT_PATH ${PROJECT_BINARY_DIR}/lib)
ADD_LIBRARY(test SHARED ${testLIB_SRC})
ADD_LIBRARY(test_static STATIC ${testLIB_SRC})
SET_TARGET_PROPERTIES(test_static PROPERTIES OUTPUT_NAME "test")
3.同时生成动态库和静态库过程
在编译目录 /home/a/testLIB/build/lib 下同时生成了动态库libtest.so和静态库libtest.a