gpt4 book ai didi

c++ - 如何正确链接子目录中的静态库?

转载 作者:太空宇宙 更新时间:2023-11-04 12:35:03 25 4
gpt4 key购买 nike

我正在尝试链接到一个我使用 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 的文件中我需要做 #include "Object/object.hpp"尽管 object.hppobject.cpp 在同一目录中.

如何正确地将 Main 项目链接到 First 项目,这样我就不必 #include <Object/object.hpp> ?或者这是唯一的方法吗?还是我走错了路?

最佳答案

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

添加额外的依赖项似乎是多余的,因为 CMake fill 通过 target_link_libraries 解决了这个问题。我能够运行 CMake 并构建项目,但是除了 main.cpp 之外,我的文件都是空的。

这是我的 CMakeLists.txt

先/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)

第二个/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)

关于c++ - 如何正确链接子目录中的静态库?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56794845/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com