CMake教程02-如何添加库方法

CMake教程02-如何添加库方法

一个项目不可能仅仅包含一个源文件,通常一个项目由几个子模块功能组合而成,这样既方便项目的并行开发也方便后期的功能维护

今天我们就来看看如何在cmake构建的项目中配置方法库。

项目结构如下:

$ tree ./
./
├── CMakeLists.txt
├── config.h.in
├── func
│   ├── CMakeLists.txt
│   ├── myfunc.cpp
│   └── myfunc.h
└── hello.cpp

其中,myfunc.h内容为:

#include<iostream>
using namespace std;

void print_info();

myfunc.cpp内容如下:

#include "myfunc.h"

void print_info()
{
    cout << "This is a library function!" << endl;
}

func子目录下新建CMakeLists.txt文件,内容为:

# 标记当前添加了一个名为myfunc的库,构建后会生成对应的libmyfunc.a文件
add_library(myfunc myfunc.cpp)

修改项目根目录下的CMakeLists.txt文件,添加内容:

# 添加库所在子目录
add_subdirectory(func)

# 添加可执行程序及源代码文件
add_executable(first_app hello.cpp)

# 添加头文件搜索目录
target_include_directories(first_app PUBLIC
    "${PROJECT_BINARY_DIR}"
    "${PROJECT_SOURCE_DIR}/func"
    )

# 添加库
target_link_libraries(first_app PUBLIC myfunc)

其中,添加add_subdirectory(func)这行就可以关联到func/CMakeLists.txt文件,在构建可执行程序时可以自动构建这个func目录下的库了; 为了能够让构建目标first_app的源码文件可以调用到func目录下的库文件,我们还需要在target_include_directories()添加${PROJECT_SOURCE_DIR}/func目录,相当于编译时g++-I引入的目录,而target_link_libraries()添加的myfunc相当于编译器g++-lmyfunc链接库文件。

到这里,我们就可以构建这个项目了。

可选择的构建库文件

修改项目根目录下CMakeLists.txt文件,在configure_file()前添加如下内容:

option(USE_MYFUNC "使用自定义库文件" ON)

configure_file(config.h.in config.h)

这里的option()设置默认情况下开启USE_MYFUNC宏定义,思考下如果将option()放到configure_file()下面会怎样呢?两者区别在哪里?

继续修改项目根目录下CMakeLists.txt文件,添加如下内容:

if(USE_MYFUNC)
  add_subdirectory(func)
  list(APPEND EXTRA_LIBS myfunc)
  list(APPEND EXTRA_INCLUDES "${PROJECT_SOURCE_DIR}/func")
endif()

# 添加可执行程序及源来了代码文件
add_executable(first_app hello.cpp)

# 添加头文件搜索目录
target_include_directories(first_app PUBLIC
    "${PROJECT_BINARY_DIR}"
    "${EXTRA_INCLUDES}"
    )

# 添加库
target_link_libraries(first_app PUBLIC ${EXTRA_LIBS})

修改完CMakeLists.txt文件后,如果让源代码可以正确运行,还需要对源代码文件作一些修改,添加USE_MYFUNC宏定义功能开关:

修改hello.cpp文件:

#ifdef USE_MYFUNC
#include "myfunc.h"
#endif


#ifdef USE_MYFUNC
    print_info();
#endif

这样,当我们关闭了USE_MYFUNC宏功能开关时才不会出现代码编译错误(找不到print_info()方法)。

如果我们打算开启使用myfunc库文件功能,只需要在config.h.in文件中添加一个宏定义即可。

// 开启使用myfunc库功能
#cmakedefine USE_MYFUNC

使用命令行关闭宏功能开关方法:

$ cmake ../hello -DUSE_MYFUNC=OFF

到这里,我们了解了如何添加库以及通过选项开关控制功能,现在你可以练习一下。


转载本文时请注明出处及本文链接地址CMake教程02-如何添加库方法

发表评论

您的电子邮箱地址不会被公开。 必填项已用*标注