美文网首页CPP学习
CMake构建静态库和动态库

CMake构建静态库和动态库

作者: 魔性佛心 | 来源:发表于2020-04-14 17:51 被阅读0次

    参考:[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构建静态库和动态库

        本文链接:https://www.haomeiwen.com/subject/ahntvhtx.html