CMake构建静态库和动态库

参考:[CLion中使用CMake导入第三方库的方法](https://blog.csdn.net/asdfsadfasdfsa/article/details/87343136 CMake)

1、使用sqlite3源码同时编译动态库和静态库


# 设定编译宏
add_definitions(-DSQLITE3_EXPORTS -DSQLITE_ENABLE_COLUMN_METADATA -DSQLITE_ENABLE_RTREE)
add_definitions('-arch arm64')

#设置MAPZONE SDK主目录变量
#生成静态库和动态库的存放地址
set(MAPZONE_SDK_CORE ../../../)

#区分不同的平台
if (APPLE)
    set(LIBRARY_OUTPUT_PATH ${MAPZONE_SDK_CORE}/bin/mac/mzcorelib/)
elseif(UNIX)
    set(LIBRARY_OUTPUT_PATH ${MAPZONE_SDK_CORE}/bin/linux/mzcorelib/)
endif ()

#设置头文件引用目录位置
include_directories(${MAPZONE_SDK_CORE}/include)

#设置连接库引用目录位置
link_directories(${LIBRARY_OUTPUT_PATH})

#设置编译源码
set(SOURCE_FILES sqlite3.c)

#设置编译成果
add_library(mzsqlite_shared SHARED ${SOURCE_FILES})
add_library(mzsqlite_static STATIC ${SOURCE_FILES})

#重置编译成果名称
set_target_properties(mzsqlite_shared PROPERTIES OUTPUT_NAME "mzsqlite")
set_target_properties(mzsqlite_static PROPERTIES OUTPUT_NAME "mzsqlite")

2、一般项目的CMake文件配置

set(LINK_DIR /usr/lib2/libnet-1.2-rc3/src/.libs)
set(LINK_DIR2 /usr/lib2/libpcap-1.0.0)
set(PRO simple_network_sniffer)
#1.cmake verson,指定cmake版本
cmake_minimum_required(VERSION 3.2)
 
#2.project name,指定项目的名称,一般和项目的文件夹名称对应
PROJECT(${PRO})
 
 
 
#3.head file path,头文件目录
INCLUDE_DIRECTORIES(
        include
)
# 设置库文件的寻找目录
link_directories(${LINK_DIR}
        ${LINK_DIR2})

# 需要链接的库
link_libraries(net pcap)
 
#4.source directory,源文件目录 
#将src目录中的所有源文件 给变量 DIR_SRCS
AUX_SOURCE_DIRECTORY(src DIR_SRCS)
 
#5.set environment variable,设置环境变量,编译用到的源文件全部都要放到这里,否则编译能够通过,但是执行的时候会出现各种问题,比如"symbol lookup error xxxxx , undefined symbol"
#SET(TEST_MATH ${DIR_SRCS})
 
#6.add executable file,添加要编译的可执行文件
ADD_EXECUTABLE(${PRO} ${DIR_SRCS})
 
#7.add link library,添加可执行文件所需要的库,比如我们用到了libm.so(命名规则:lib+name+.so),就添加该库的名称
TARGET_LINK_LIBRARIES(${PRO} net pcap)

3、Cmake内部变量

CMAKE_C_COMPILER:指定C编译器

CMAKE_CXX_COMPILER:

CMAKE_C_FLAGS:编译C文件时的选项,如-g;也可以通过add_definitions添加编译选项

EXECUTABLE_OUTPUT_PATH:可执行文件的存放路径

LIBRARY_OUTPUT_PATH:库文件路径

CMAKE_BUILD_TYPE::build 类型(Debug, Release, ...),CMAKE_BUILD_TYPE=Debug

BUILD_SHARED_LIBS:Switch between shared and static libraries

内置变量的使用:

>> 在CMakeLists.txt中指定,使用set

>> cmake命令中使用,如cmake -DBUILD_SHARED_LIBS=OFF

4、CMake命令说明

project (HELLO) 指定项目名称,生成的VC项目的名称;

使用${HELLO_SOURCE_DIR}表示项目根目录

include_directories:指定头文件的搜索路径,相当于指定gcc的-I参数

include_directories (${HELLO_SOURCE_DIR}/Hello) #增加Hello为include目录

link_directories:动态链接库或静态链接库的搜索路径,相当于gcc的-L参数

   >> link_directories (${HELLO_BINARY_DIR}/Hello)     #增加Hello为link目录

add_subdirectory:包含子目录

   >> add_subdirectory (Hello)

add_executable:编译可执行程序,指定编译,好像也可以添加.o文件

   >> add_executable (helloDemo demo.cxx demo_b.cxx)   #将cxx编译成可执行文件——

add_definitions:添加编译参数

add_definitions(-DDEBUG)将在gcc命令行添加DEBUG宏定义;

add_definitions( “-Wall -ansi –pedantic –g”)

target_link_libraries:添加链接库,相同于指定-l参数

target_link_libraries(demo Hello) #将可执行文件与Hello连接成最终文件demo

add_library: 生成动态库或者静态库

add_library(Hello hello.cxx) #将hello.cxx编译成静态库如libHello.a

add_custom_target:

message( status|fatal_error, “message”):

set_target_properties( ... ): lots of properties... OUTPUT_NAME, VERSION, ....

link_libraries( lib1 lib2 ...): All targets link with the same set of libs

你可能感兴趣的:(CMake构建静态库和动态库)