【发布时间】:2018-02-12 20:55:00
【问题描述】:
我第一次尝试将 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 "libfoo/libfoo.h"的形式,这样我可以避免将来发生文件名冲突。如何做到这一点?
【问题讨论】:
-
使用 include_directories 为您的 *.h 文件添加路径
-
您可能还应该指定
target_include_directories和libfoo -
我认为
${LIBFOO_SRCS}应该是来源。"libfoo.h"不是源文件,不应在add_library中列出。大概吧。 -
@nwp 在 CMake 中,您通常会在源列表中同时包含 .cpp 和 .h 文件。
-
第二条@VTT 评论,另外您可能希望确保使用
PUBLIC标志,以便消费者也获得包含目录。