我正在尝试第一次使用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
标头,因此目前无法编译。因此,我的问题是:
为什么libfoo.h
标题不可见,因为我已将库添加为可执行文件的target_link_library?
有没有更好的方法来设置CMakeLists.txt文件?
我希望libfoo.h
库的必需include目录的格式为#include "libfoo/libfoo.h"
,这样我以后就可以避免文件名冲突了。怎么办呢?
答案 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>
。