【发布时间】:2019-06-27 15:59:26
【问题描述】:
我正在尝试链接到我使用 CMake 构建并具有子目录结构的静态库。看起来是这样的(->代表一个目录):
Root
| - CMakeLists.txt
| -> First
| | - CMakeLists.txt
| | -> Object
| | | - object.cpp object.hpp
| |
| -> Second
| | - CMakeLists.txt
| | - secondObject.hpp secondObject.cpp
| |
| -> Third
| | - CMakeLists.txt
| | - thirdObject.hpp thirdObject.cpp
| |
| -> Main
| - CMakeLists.txt
| - main.cpp
在 Root 的 cmake 文件中:
cmake_minimum_required(VERSION 3.0)
project(Main)
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin)
include_directories(First)
include_directories(Second)
include_directories(Third)
add_subdirectory(First)
add_subdirectory(Second)
add_subdirectory(Third)
add_subdirectory(Main)
在 First 的 cmake 文件中:
project(First)
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin)
add_library(First STATIC Object/object.cpp Object/object.hpp)
add_dependencies(First Second Third)
target_link_libraries( First Second Third)
Second 和 Third 类似,但 second 只依赖于 Third,而 Third 根本不依赖任何东西。当我尝试将它与我的 Main 的 cmake 文件链接时出现问题:
project(Main)
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin)
set(Main First Second Third)
add_executable(Main main.cpp)
target_link_libraries(Main First Second Third)
当我从构建文件夹运行cmake .. 时,它会很开心,不会抱怨。但是,当我在 GUI 中点击 make 或 Generate for Windows 时,我会收到 object.hpp: No such file or directory 的投诉。我将其包含在main.cpp 中。我显然可以将其更改为#include <Object/object.hpp>,但我觉得这违背了链接到库的目的。 (也许这是错误的想法)。
我也遇到过类似的问题,在像这样的其他结构中,在像object.cpp 这样的文件中,即使object.hpp 与object.cpp 在同一目录中,我也需要执行#include "Object/object.hpp"。
如何正确地将项目 Main 链接到 project First,这样我就不必#include <Object/object.hpp>?或者这是唯一的方法吗?还是我走错了路?
【问题讨论】:
-
只需将
target_include_directories(First PUBLIC Object)添加到First/CMakeLists中,即可将该路径作为包含目录导出到与First 链接的其他项目。
标签: c++ cmake compilation subdirectory