使用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更新了我的答案。希望这有帮助!是的,谢谢!我更新了帖子以显示这些变化。