Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/140.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何正确链接子目录中的静态库?_C++_Cmake_Compilation_Subdirectory - Fatal编程技术网

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

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

我正在尝试链接一个静态库,该库是我使用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_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
,将该路径作为包含目录导出到与第一个链接的其他项目。