c++ - CMake - 同一项目中的应用程序/库之间的依赖项( header )

标签 c++ visual-studio-2010 dependencies cmake header-files

我的项目结构如下:

  • CMakeLists.txt
    • lib1/CMakeLists.txt 以及lib的所有cpp和头文件
    • lib2/CMakeLists.txt 和 lib 的所有 cpp 和头文件
    • app/CMakeLists.txt 以及应用的所有cpp和头文件

主要的 CMakeLists.txt 看起来像:

PROJECT( ${PROJECT_NAME} )
add_subdirectory(lib1)
add_subdirectory(lib2)
add_subdirectory(app)

lib1/CMakeLists.txt 看起来像(已剥离):

SET(SOURCE
file.cpp
)
SET(HEADERS
    some_lib_header.h
)
add_library( lib1 ${SOURCE} ${HEADERS} )

除了 ADD_EXECUTABLE 之外,应用程序的外观相同:

SET(SOURCE
main.cpp
)
SET(HEADERS
    some_header.h
)
add_library( lib1 ${SOURCE} ${HEADERS} )
ADD_EXECUTABLE( app ${SOURCE} ${HEADERS} )

我发现这种设置运行良好,因为这样,我可以生成一个包含所有这三个项目的 Visual Studio 解决方案文件。但我的问题是我的应用程序包含 lib1 的头文件(以及依赖于 lib1 的 lib2 的头文件)。当我这样做时

$mkdir build
$cd build
$cmake -C ..\myproject

它会根据我的需要生成源外的 VS .sln 文件,但应用程序无法编译,因为它找不到 lib1 的头文件(显然)。

现在我阅读并尝试了很多东西,比如 TARGET_LINK_LIBRARIES( app lib1 ) (它让应用程序与 lib1 链接,但没有解决标题包含问题),以及诸如 之类的东西add_subdirectory( ../lib1 ) 在应用程序的 CMakeLists.txt 中的各种变体中(所有这些都引发了我无法修复的错误),还有 find_package (我猜这是错误的方法)。

那么我该如何解决这个(我猜很简单......)问题?

最佳答案

这是一种可能的解决方案:

根 CMakeLists.txt:

cmake_minimum_required(VERSION 2.8 FATAL_ERROR)
project(${PROJECT_NAME})
add_subdirectory(lib1)
add_subdirectory(lib2)
add_subdirectory(app)


lib1/CMakeLists.txt:

project(Lib1)
add_library(lib1 lib1.cpp lib1.h)


lib2/CMakeLists.txt:

project(Lib2)
add_library(lib2 lib2.cpp lib2.h)

# Add /lib1 to #include search path
include_directories(${Lib1_SOURCE_DIR})
# Specify lib2's dependency on lib1
target_link_libraries(lib2 lib1)


app/CMakeLists.txt:

project(App)
add_executable(app main.cpp some_header.h)

# Add /lib1 and /lib2 to #include search path
include_directories(${Lib1_SOURCE_DIR} ${Lib2_SOURCE_DIR})
# Specify app's dependency on lib2.
# lib2's dependency on lib1 is automatically added.
target_link_libraries(app lib2)


这里有很多不同的方法可以达到相同的最终结果。对于一个相对较小的项目,我可能只使用一个 CMakeLists.txt:

cmake_minimum_required(VERSION 2.8 FATAL_ERROR)
project(Test)

add_library(lib1 lib1/lib1.cpp lib1/lib1.h)
add_library(lib2 lib2/lib2.cpp lib2/lib2.h)
add_executable(app app/main.cpp app/some_header.h)

include_directories(${CMAKE_SOURCE_DIR}/lib1 ${CMAKE_SOURCE_DIR}/lib2)

target_link_libraries(lib2 lib1)
target_link_libraries(app lib2)


有关相关命令及其原理的更多信息,请运行:

cmake --help-command add_subdirectory
cmake --help-command include_directories
cmake --help-command target_link_libraries

关于c++ - CMake - 同一项目中的应用程序/库之间的依赖项( header ),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11216408/

相关文章:

javascript - C++ uWebSockets 服务器可以与 JavaScript 客户端通信吗?

C++ SQL 查询/为 C++ 封装的 SQL?

c# - 程序集错误building app - Encountered multiple versions of assembly

graph - CMake graphviz自动生成

amazon-web-services - 在 terraform 中更改/删除资源时的依赖冲突

c++ - 如何从采样率和单极点低通滤波器的alpha系数计算截止频率?

用于构建执行管道的 C++ 库

visual-studio-2010 - Visual Studio 2010 不会重新加载打开的文件

c++ - <hash_set> 相等运算符在 VS2010 中不起作用

C++ 对象层次结构——如何管理循环依赖?