C++ 如何正确链接子目录中的静态库?
我正在尝试链接一个静态库,该库是我使用CMake构建的,并且有一个子目录结构。它看起来像这样(C++ 如何正确链接子目录中的静态库?,c++,cmake,compilation,subdirectory,C++,Cmake,Compilation,Subdirectory,我正在尝试链接一个静态库,该库是我使用CMake构建的,并且有一个子目录结构。它看起来像这样(->表示一个目录): 在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_d
->
表示一个目录):
在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)
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)
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)
在First的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)
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)
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)
第二和第三是相似的,但第二只依赖于第三,第三根本不依赖任何东西。当我尝试将其与Main的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)
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)
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:没有这样的文件或目录
。我正在main.cpp
中包含此内容。很明显,我可以将其更改为#include
,但我觉得这违背了链接到库中的目的。(也许这是错误的想法)
我也遇到过类似的问题,在类似这样的其他结构中,在像object.cpp
这样的文件中,我需要执行#包括“object/object.hpp”
,即使object.hpp
与object.cpp
位于同一目录中
如何正确地首先将project Main链接到project,这样我就不必
#包含?还是这是唯一的办法?还是我走错了方向 对于我来说,我的CMakeLists.txt
的以下解决方案是可行的。我还认为您只需要在顶级目录中调用一次add_project
添加额外的依赖项似乎是超级棒,因为CMake fill通过target\u link\u库
来解决这个问题。我能够运行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)
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin)
add_library(Second STATIC secondObject.cpp secondObject.hpp)
target_link_libraries( Second Third)
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin)
add_library(Third STATIC thirdObject.cpp thirdObject.hpp)
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)
Second/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)
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin)
add_library(Second STATIC secondObject.cpp secondObject.hpp)
target_link_libraries( Second Third)
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin)
add_library(Third STATIC thirdObject.cpp thirdObject.hpp)
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)
Third/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)
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin)
add_library(Second STATIC secondObject.cpp secondObject.hpp)
target_link_libraries( Second Third)
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin)
add_library(Third STATIC thirdObject.cpp thirdObject.hpp)
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)
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)
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin)
add_library(Second STATIC secondObject.cpp secondObject.hpp)
target_link_libraries( Second Third)
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin)
add_library(Third STATIC thirdObject.cpp thirdObject.hpp)
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)
对我来说,我的CMakeLists.txt
的以下解决方案是可行的。我还认为您只需要在顶级目录中调用一次add_project
添加额外的依赖项似乎是超级棒,因为CMake fill通过target\u link\u库
来解决这个问题。我能够运行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)
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin)
add_library(Second STATIC secondObject.cpp secondObject.hpp)
target_link_libraries( Second Third)
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin)
add_library(Third STATIC thirdObject.cpp thirdObject.hpp)
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)
Second/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)
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin)
add_library(Second STATIC secondObject.cpp secondObject.hpp)
target_link_libraries( Second Third)
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin)
add_library(Third STATIC thirdObject.cpp thirdObject.hpp)
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)
Third/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)
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin)
add_library(Second STATIC secondObject.cpp secondObject.hpp)
target_link_libraries( Second Third)
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin)
add_library(Third STATIC thirdObject.cpp thirdObject.hpp)
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)
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)
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin)
add_library(Second STATIC secondObject.cpp secondObject.hpp)
target_link_libraries( Second Third)
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin)
add_library(Third STATIC thirdObject.cpp thirdObject.hpp)
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)
只需将target\u include\u目录(第一个公共对象)
添加到First/CMakeLists
,即可将该路径作为include目录导出到与First链接的其他项目中。只需将target\u include\u目录(第一个公共对象)
添加到First/CMakeLists
,将该路径作为包含目录导出到与第一个链接的其他项目。