【问题标题】:How to properly link against a static library within a subdirectory?如何正确链接子目录中的静态库?
【发布时间】: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.hppobject.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


【解决方案1】:

对我来说,CMakeLists.txt 的以下解决方案是可行的。我还认为您只需要在顶级目录中调用一次add_project

添加额外的依赖项似乎是多余的,因为 CMake 填充由 target_link_libraries 解决。我能够运行 CMake 并构建项目,但我的文件除了 main.cpp 是空的。

这是我的 CMakeLists.txt

First/CMakeLists.txt

set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin)    
add_library(First STATIC Object/object.cpp Object/object.hpp)    
target_link_libraries( First Second Third)

Second/CMakeLists.txt

set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin)
add_library(Second STATIC secondObject.cpp secondObject.hpp)
target_link_libraries( Second Third)

第三/CMakeLists.txt

set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin)
add_library(Third STATIC thirdObject.cpp thirdObject.hpp)

CMakeLists.txt

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)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-10-22
    • 2013-08-04
    • 2012-02-23
    • 2012-12-14
    • 2023-03-17
    • 1970-01-01
    • 1970-01-01
    • 2015-10-05
    相关资源
    最近更新 更多