Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/160.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/cmake/2.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
使用CMake和C+处理共享库依赖关系+; 我有一个C++项目,它使用共享库,其中有些库有自己的依赖关系。但是,我被迫在main.cpp文件中包含共享库依赖项的头文件。我假设这是我如何组织我的项目的一个问题,但我不确定_C++_Cmake_Compiler Errors - Fatal编程技术网

使用CMake和C+处理共享库依赖关系+; 我有一个C++项目,它使用共享库,其中有些库有自己的依赖关系。但是,我被迫在main.cpp文件中包含共享库依赖项的头文件。我假设这是我如何组织我的项目的一个问题,但我不确定

使用CMake和C+处理共享库依赖关系+; 我有一个C++项目,它使用共享库,其中有些库有自己的依赖关系。但是,我被迫在main.cpp文件中包含共享库依赖项的头文件。我假设这是我如何组织我的项目的一个问题,但我不确定,c++,cmake,compiler-errors,C++,Cmake,Compiler Errors,项目结构: - myproject |-> foo1 |-> include |-> foo1_stuff.hpp |-> src |-> main.cpp |-> build |-> CMakeLists.txt |-> foo2 |-> include |-> foo2_stuff.hpp |-> src |-> main.cpp |-> build

项目结构:

- myproject
|-> foo1
  |-> include
    |-> foo1_stuff.hpp
  |-> src
    |-> main.cpp
  |-> build
  |-> CMakeLists.txt
|-> foo2
  |-> include
    |-> foo2_stuff.hpp
  |-> src
    |-> main.cpp
  |-> build
  |-> CMakeLists.txt
|-> lib
  |-> bar
    |-> include
      |-> bar.hpp
    |-> src
      |-> bar.cpp
  |-> bar_tool
    |-> include
      |-> bar_tool.hpp
    |-> src
      |-> bar_tool.cpp
  |-> CmakeLists.txt
foo1的main.cpp:

#include <bar_tool.hpp>

int main()
{
    bar_tool tool;
    tool.doStuff();

    return 0;
}
Foo1 CMakeLists:

cmake_minimum_required(VERSION 3.10.2)
project(foo)

set(PROJECT_ROOT ~/myproject/)
set(
    CMAKE_RUNTIME_OUTPUT_DIRECTORY ${PROJECT_ROOT}/bin/
)

link_directories(
    /usr/local/lib
    /usr/lib
    ${PROJECT_ROOT}/lib
)

include_directories(
    include
    ${PROJECT_ROOT}/lib/bar_tool/include
)

file(GLOB SOURCES "src/*.cpp")

add_executable(${PROJECT_NAME} ${SOURCES})
target_link_libraries(
    ${PROJECT_NAME}
    bar_tool
)
cmake_minimum_required(VERSION 3.10.2)
project(myproject)

set(PROJECT_ROOT ~/myproject/)
set(
    CMAKE_LIBRARY_OUTPUT_DIRECTORY
    ${PROJECT_ROOT}/lib/
)

link_directories(
    /usr/local/lib
    /usr/lib
    ${PROJECT_ROOT}/lib
)

include_directories(
    include
    ${PROJECT_ROOT}/lib/bar/include
    ${PROJECT_ROOT}/lib/bar_tool/include
)

# bar library
set(LIB_NAME "bar")
file(GLOB LIB_SRC "${LIB_NAME}/src/*.cpp")
add_library(${LIB_NAME} SHARED ${LIB_SRC})

# bar_tool library
set(LIB_NAME "bar_tool")
file(GLOB LIB_SRC "${LIB_NAME}/src/*.cpp")
add_library(${LIB_NAME} SHARED ${LIB_SRC})
target_link_libraries(
    ${LIB_NAME}
        bar
)
cmake_minimum_required(VERSION 3.10.2)
project(myproject)

set(PROJECT_ROOT ~/myproject/)
set(
    CMAKE_LIBRARY_OUTPUT_DIRECTORY
    ${PROJECT_ROOT}/lib/
)

# bar library
set(LIB_NAME "bar")
file(GLOB LIB_SRC "${LIB_NAME}/src/*.cpp")
add_library(${LIB_NAME} SHARED ${LIB_SRC})
target_include_directories(
    ${LIB_NAME} PUBLIC
    ${PROJECT_ROOT}/lib/bar/include
)

# bar_tool library
set(LIB_NAME "bar_tool")
file(GLOB LIB_SRC "${LIB_NAME}/src/*.cpp")
add_library(${LIB_NAME} SHARED ${LIB_SRC})
target_include_directories(
    ${LIB_NAME} PUBLIC
    ${PROJECT_ROOT}/lib/bar_tool/include
)
target_link_libraries(
    ${LIB_NAME} PUBLIC
    bar
)
cmake_minimum_required(VERSION 3.10.2)
project(foo)

set(PROJECT_ROOT /home/mrd/Development/compile_test)
set(
    CMAKE_RUNTIME_OUTPUT_DIRECTORY ${PROJECT_ROOT}/bin/
)

add_subdirectory(${PROJECT_ROOT}/lib/ bin)

file(GLOB SOURCES "src/*.cpp")

add_executable(${PROJECT_NAME} ${SOURCES})
target_link_libraries(
    ${PROJECT_NAME}
    bar_tool
)
共享库CMakeLists:

cmake_minimum_required(VERSION 3.10.2)
project(foo)

set(PROJECT_ROOT ~/myproject/)
set(
    CMAKE_RUNTIME_OUTPUT_DIRECTORY ${PROJECT_ROOT}/bin/
)

link_directories(
    /usr/local/lib
    /usr/lib
    ${PROJECT_ROOT}/lib
)

include_directories(
    include
    ${PROJECT_ROOT}/lib/bar_tool/include
)

file(GLOB SOURCES "src/*.cpp")

add_executable(${PROJECT_NAME} ${SOURCES})
target_link_libraries(
    ${PROJECT_NAME}
    bar_tool
)
cmake_minimum_required(VERSION 3.10.2)
project(myproject)

set(PROJECT_ROOT ~/myproject/)
set(
    CMAKE_LIBRARY_OUTPUT_DIRECTORY
    ${PROJECT_ROOT}/lib/
)

link_directories(
    /usr/local/lib
    /usr/lib
    ${PROJECT_ROOT}/lib
)

include_directories(
    include
    ${PROJECT_ROOT}/lib/bar/include
    ${PROJECT_ROOT}/lib/bar_tool/include
)

# bar library
set(LIB_NAME "bar")
file(GLOB LIB_SRC "${LIB_NAME}/src/*.cpp")
add_library(${LIB_NAME} SHARED ${LIB_SRC})

# bar_tool library
set(LIB_NAME "bar_tool")
file(GLOB LIB_SRC "${LIB_NAME}/src/*.cpp")
add_library(${LIB_NAME} SHARED ${LIB_SRC})
target_link_libraries(
    ${LIB_NAME}
        bar
)
cmake_minimum_required(VERSION 3.10.2)
project(myproject)

set(PROJECT_ROOT ~/myproject/)
set(
    CMAKE_LIBRARY_OUTPUT_DIRECTORY
    ${PROJECT_ROOT}/lib/
)

# bar library
set(LIB_NAME "bar")
file(GLOB LIB_SRC "${LIB_NAME}/src/*.cpp")
add_library(${LIB_NAME} SHARED ${LIB_SRC})
target_include_directories(
    ${LIB_NAME} PUBLIC
    ${PROJECT_ROOT}/lib/bar/include
)

# bar_tool library
set(LIB_NAME "bar_tool")
file(GLOB LIB_SRC "${LIB_NAME}/src/*.cpp")
add_library(${LIB_NAME} SHARED ${LIB_SRC})
target_include_directories(
    ${LIB_NAME} PUBLIC
    ${PROJECT_ROOT}/lib/bar_tool/include
)
target_link_libraries(
    ${LIB_NAME} PUBLIC
    bar
)
cmake_minimum_required(VERSION 3.10.2)
project(foo)

set(PROJECT_ROOT /home/mrd/Development/compile_test)
set(
    CMAKE_RUNTIME_OUTPUT_DIRECTORY ${PROJECT_ROOT}/bin/
)

add_subdirectory(${PROJECT_ROOT}/lib/ bin)

file(GLOB SOURCES "src/*.cpp")

add_executable(${PROJECT_NAME} ${SOURCES})
target_link_libraries(
    ${PROJECT_NAME}
    bar_tool
)
我希望使用编译的bar_工具共享库(
libbar_工具.so
)不需要在foo1的CMakeLists的
include_目录
部分包含
bar.hpp
)。但是,如果不这样做,则会出现以下错误:

In file included from /home/mrd/Development/compile_test/foo/src/main.cpp:1:0:
/home/mrd/Development/compile_test/lib/bar_tool/include/bar_tool.hpp:1:10: fatal error: bar.hpp: No such file or directory
 #include <bar.hpp>
          ^~~~~~~~~
compilation terminated.
不确定这是否有任何影响,但我也改变了这一点:

更新了Foo1 CmakeList:

cmake_minimum_required(VERSION 3.10.2)
project(foo)

set(PROJECT_ROOT ~/myproject/)
set(
    CMAKE_RUNTIME_OUTPUT_DIRECTORY ${PROJECT_ROOT}/bin/
)

link_directories(
    /usr/local/lib
    /usr/lib
    ${PROJECT_ROOT}/lib
)

include_directories(
    include
    ${PROJECT_ROOT}/lib/bar_tool/include
)

file(GLOB SOURCES "src/*.cpp")

add_executable(${PROJECT_NAME} ${SOURCES})
target_link_libraries(
    ${PROJECT_NAME}
    bar_tool
)
cmake_minimum_required(VERSION 3.10.2)
project(myproject)

set(PROJECT_ROOT ~/myproject/)
set(
    CMAKE_LIBRARY_OUTPUT_DIRECTORY
    ${PROJECT_ROOT}/lib/
)

link_directories(
    /usr/local/lib
    /usr/lib
    ${PROJECT_ROOT}/lib
)

include_directories(
    include
    ${PROJECT_ROOT}/lib/bar/include
    ${PROJECT_ROOT}/lib/bar_tool/include
)

# bar library
set(LIB_NAME "bar")
file(GLOB LIB_SRC "${LIB_NAME}/src/*.cpp")
add_library(${LIB_NAME} SHARED ${LIB_SRC})

# bar_tool library
set(LIB_NAME "bar_tool")
file(GLOB LIB_SRC "${LIB_NAME}/src/*.cpp")
add_library(${LIB_NAME} SHARED ${LIB_SRC})
target_link_libraries(
    ${LIB_NAME}
        bar
)
cmake_minimum_required(VERSION 3.10.2)
project(myproject)

set(PROJECT_ROOT ~/myproject/)
set(
    CMAKE_LIBRARY_OUTPUT_DIRECTORY
    ${PROJECT_ROOT}/lib/
)

# bar library
set(LIB_NAME "bar")
file(GLOB LIB_SRC "${LIB_NAME}/src/*.cpp")
add_library(${LIB_NAME} SHARED ${LIB_SRC})
target_include_directories(
    ${LIB_NAME} PUBLIC
    ${PROJECT_ROOT}/lib/bar/include
)

# bar_tool library
set(LIB_NAME "bar_tool")
file(GLOB LIB_SRC "${LIB_NAME}/src/*.cpp")
add_library(${LIB_NAME} SHARED ${LIB_SRC})
target_include_directories(
    ${LIB_NAME} PUBLIC
    ${PROJECT_ROOT}/lib/bar_tool/include
)
target_link_libraries(
    ${LIB_NAME} PUBLIC
    bar
)
cmake_minimum_required(VERSION 3.10.2)
project(foo)

set(PROJECT_ROOT /home/mrd/Development/compile_test)
set(
    CMAKE_RUNTIME_OUTPUT_DIRECTORY ${PROJECT_ROOT}/bin/
)

add_subdirectory(${PROJECT_ROOT}/lib/ bin)

file(GLOB SOURCES "src/*.cpp")

add_executable(${PROJECT_NAME} ${SOURCES})
target_link_libraries(
    ${PROJECT_NAME}
    bar_tool
)

欢迎提出任何其他建议

由于您拥有已编译的库,因此不需要添加源文件的路径。 所有函数调用、外部变量访问等都将链接到此预编译库

然而,当您包含头文件时,情况并非如此。 Make在编译之前创建一个依赖项列表,试图在其中定位所有的头。
因此,必须提供直接或间接包含的所有标题的路径。

在您的共享库<代码> cMaKelist.txt < /Cord>文件中,考虑添加关键字,以确保传递依赖关系(即<代码> bar <代码>库)可以传播到最终目标。此外,现代CMake鼓励使用而不是
包含目录()
。同样,您也应该在此处添加
PUBLIC
关键字:

target_include_directories(bar PUBLIC
    ${PROJECT_ROOT}/lib/bar/include
)
target_include_directories(bar_tool PUBLIC
    ${PROJECT_ROOT}/lib/bar_tool/include
)

target_link_libraries(
    ${LIB_NAME} PUBLIC
        bar
)

您能否解释一下,为了在不包含头文件的情况下使用预编译库,需要更改哪些内容?我添加了
PUBLIC
,如图所示,但这并没有解决问题problem@user3489620更新了我的答案。希望这有帮助!是的,谢谢!我更新了帖子以显示这些变化。