CMake的骨架项目

时间:2018-02-12 20:55:00

标签: c++ cmake

我正在尝试第一次使用CMake进行项目,并且需要一些帮助以我喜欢的方式设置项目。我可能做错了什么,所以请耐心等待。我目前有以下目录结构:

/CMakeLists.txt
/main/CMakeLists.txt
      main.cc
/libfoo/CMakeLists.txt
        libfoo.h
        libfoo.cc

这里libfoo是一个git子模块,也应该包含在其他项目中。我的CMakeLists.txt文件如下:

/CMakeLists.txt:

cmake_minimum_required (VERSION 3.10)
project(server)
set(CMAKE_INCLUDE_CURRENT_DIR ON)
add_subdirectory(main)
add_subdirectory(libfoo)

/main/CMakeLists.txt:

set(MAIN_SRCS
    "main.cc"
) 
add_executable(server
    ${MAIN_SRCS}
)
target_link_libraries(server
    libfoo
)

/libfoo/CMakeLists.txt:

cmake_minimum_required (VERSION 3.10)
project(libfoo)
set(CMAKE_INCLUDE_CURRENT_DIR ON)
set(LIBFOO_SRCS
    "libfoo.cc"
    "libfoo.h"
)
add_library(libfoo STATIC
    ${LIBFOO_SRCS}
)

我当前的main.cc非常简单:

#include "libfoo.h"

int main(int argc, char** argv) {
  return 0;
}

但是,由于未找到libfoo.h标头,因此目前无法编译。因此,我的问题是:

  1. 为什么libfoo.h标题不可见,因为我已将库添加为可执行文件的target_link_library?

  2. 有没有更好的方法来设置CMakeLists.txt文件?

  3. 我希望libfoo.h库的必需include目录的格式为#include "libfoo/libfoo.h",这样我以后就可以避免文件名冲突了。怎么办呢?

1 个答案:

答案 0 :(得分:0)

通过设置变量CMAKE_INCLUDE_CURRENT_DIR,您可以在处理文件libfoo/时自动包含目录libfoo/CMakeLists.txt(对于搜索标题文件)。

但是,与include_directories命令一样,这不会对父目录产生影响:处理libfoo/时不包含CMakeLists.txt。例如,请参阅该问题:No such file or directory using cmake

您可以设置变量CMAKE_INCLUDE_CURRENT_DIR_IN_INTERFACE,因此libfoo/将是" 附加"作为libfoo/CMakeLists.txt中创建的任何目标的包含目录。因此,与此类目标(在您的情况下为libfoo)的链接将传播包含目录。

<强>的CMakeLists.txt

# This will include current directory when building a target
set(CMAKE_INCLUDE_CURRENT_DIR ON)
# This will *attach* current directory as include directory to the target
set(CMAKE_INCLUDE_CURRENT_DIR_IN_INTERFACE ON)

(注意,仅在顶级CMakeLists.txt中设置变量就足够了:所有变量都自动传播到子目录。)

  

我希望libfoo.h库的必需include目录的格式为#include&#34; libfoo / libfoo.h&#34;

所以你需要一个文件<some-dir>/libfoo/libfoo.h并包含<some-dir>