CMake之建立多模块工程

在Windows下, 用CMake和Visual Studio建立一个包含多个模块的工程,其中有静态库和动态库。

多工程

本方案由一个可执行文件和一个静态库和一个动态库构成,可执行文件调用了这两个库文件,可执行文件和动态库最后生成在bin目录下,静态库生成在libs目录。完整代码

目录结构

├── bin
├── build
├── CMakeLists.txt
├── libs
└── src
    ├── CMakeLists.txt
    ├── libdynamic
    │   ├── CMakeLists.txt
    │   ├── dynamic.cpp
    │   └── dynamic.h
    ├── libstatic
    │   ├── CMakeLists.txt
    │   ├── static.cpp
    │   └── static.h
    └── main
        ├── CMakeLists.txt
        └── main.cpp

根目录的 CMakeLists.txt

PROJECT(MultiExample)
MESSAGE(STATUS "PROJECT_BINARY_DIR= " ${PROJECT_BINARY_DIR})
MESSAGE(STATUS "PROJECT_SOURCE_DIR= " ${PROJECT_SOURCE_DIR})
ADD_SUBDIRECTORY(src)

src目录的CMakeLists.txt

ADD_SUBDIRECTORY(libstatic)
ADD_SUBDIRECTORY(libdynamic)
ADD_SUBDIRECTORY(main)

动态库的CMakeLists.txt

SET(LIBRARY_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/bin)
ADD_LIBRARY(dynamic SHARED dynamic.cpp)

设定生成目录为根目录下面的bin

静态库的CMakeLists.txt

SET(LIBRARY_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/libs)
ADD_LIBRARY(static STATIC static.cpp)

设定生成目录为根目录下面的libs

可执行文件的CMakeLists.txt

INCLUDE_DIRECTORIES(${PROJECT_SOURCE_DIR}/src/libstatic 
${PROJECT_SOURCE_DIR}/src/libdynamic)
SET(EXECUTABLE_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/bin)
ADD_EXECUTABLE(main main.cpp)
TARGET_LINK_LIBRARIES(main static)
TARGET_LINK_LIBRARIES(main dynamic)

设定了头文件的查找目录,并在最后指定了需要链接的动态库和静态库,库的名字应该与ADD_LIBRARY指令中使用的名字一致

语法介绍

ADD_SUBDIRECTORY

ADD_SUBDIRECTORY指令第一个参数指的是需要添加的子目录, 子目录下面也因该有CMakeLists.txt, 第二个指make生成的最终文件存放目录,实际执行时文件被保存到了${PROJECT_BINARY_DIR}/bin下 第三个参数EXCLUDE_FROM_ALL,用来将这个目录排除。

add_subdirectory(source_dir [binary_dir] [EXCLUDE_FROM_ALL])

ADD_LIBRARY

ADD_LIBRARY生成库文件,第二个参数SHARED表示生成动态库,STATIC表示生成静态库。
add_library(<name> [STATIC | SHARED | MODULE]
            [EXCLUDE_FROM_ALL]
            [<source>...])

修改输出目录

通过改变变量EXECUTABLE_OUTPUT_PATH来修改可执行文件的生成目录,一般是结合ADD_EXECUTABLE指令使用, LIBRARY_OUTPUT_PATH修改库的生成目录,一般是结合ADD_LIBRARY指令使用。

SET(EXECUTABLE_OUTPUT_PATH <路径>)
SET(LIBRARY_OUTPUT_PATH <路径>)

INCLUDE_DIRECTORIES

这条指令可以用来向工程添加多个特定的头文件搜索路径,路径之间用空格分割,如果路径 中包含了空格,可以使用双引号将它括起来,默认的行为是追加到当前的头文件搜索路径的 后面,你可以通过两种方式来进行控制搜索路径添加的方式:
1,CMAKE_INCLUDE_DIRECTORIES_BEFORE,通过 SET 这个 cmake 变量为 on,可以 将添加的头文件搜索路径放在已有路径的前面。
2,通过 AFTER 或者 BEFORE 参数,也可以控制是追加还是置前。
INCLUDE_DIRECTORIES([AFTER|BEFORE] [SYSTEM] dir1 dir2 …)

链接库文件

添加非标准的共享库搜索路径

LINK_DIRECTORIES(directory1 directory2 ...)

为 target 添加需要链接的库,target可以是可执行文件,也可以是库文件

TARGET_LINK_LIBRARIES(target library1
                     <debug | optimized> library2
                     ...)

你可能感兴趣的:(C++,cmake语法,cmake多模块)