当前位置: 首页 > 知识库问答 >
问题:

cmake--同一项目中应用程序/库之间的依赖关系(头)

贲绪
2023-03-14

我有以下项目结构:

  • cmakelists.txt
    • lib1/cmakelists.txt以及lib的所有cpp和头文件
    • lib2/cmakelists.txt以及lib的所有cpp和头文件
    • app/cmakelists.txt和应用程序的所有cpp和头文件
    PROJECT( ${PROJECT_NAME} )
    add_subdirectory(lib1)
    add_subdirectory(lib2)
    add_subdirectory(app)
    
    SET(SOURCE
    file.cpp
    )
    SET(HEADERS
        some_lib_header.h
    )
    add_library( lib1 ${SOURCE} ${HEADERS} )
    
    SET(SOURCE
    main.cpp
    )
    SET(HEADERS
        some_header.h
    )
    add_library( lib1 ${SOURCE} ${HEADERS} )
    ADD_EXECUTABLE( app ${SOURCE} ${HEADERS} )
    
    $mkdir build
    $cd build
    $cmake -C ..\myproject
    

    它生成了我想要的源代码外的VS.sln文件,但是应用程序不能编译,因为它找不到lib1的头文件(显然)。

    现在,我阅读并尝试了许多方法,比如target_link_libraries(app lib1)(它使应用程序与lib1链接,但没有解决header include问题),以及应用程序的cmakelists.txt中各种变体中的add_subdirectory(../lib1)(它们都抛出了我无法修复的错误),还有find_package(我猜这是错误的方法)。

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

共有1个答案

印振国
2023-03-14

这里有一个可能的解决方案

根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)
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)
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)
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
 类似资料:
  • 假设有以下目录结构: 即。依赖于,依赖于这两者。(我知道静态库在技术上不“链接”,但这只是一个例子。) 问题是,在当前的设置中,lib1会编译两次--第一次在“test”构建目录中,第二次在“test/build_directory/lib2/build_directory”中。我想避免这种情况。 顶级的cmakelists.txt文件不是一个选项,因为我希望保持一个干净的顶级目录,并且能够在其他

  • 我将描述我的CMake项目目前是如何安排的。现在还早,所以欢迎提出更好的安排。 顶级 lib1 lib2 我在每个级别上都有cmakelists.txt。 在Lib1 I add_library(STATIC)中,然后使用Lib2 target_link_library,它也是静态的。 lib2的cmakelists.txt执行对Qt5Widgets、Qt5Core和qt5gui的find_pac

  • 我有一个项目被配置为: CMake项目 静态库A src(取决于B) 静态Lib B src(取决于Qt)

  • 如果你在一次对话中加载了多个项目,你就可以设置它们之间的依赖关系 ,这也将影响你的项目的构建顺序。具体做法是打开 Dependencies 标签页,在其中选中你的依赖,如图12-23所示,我们同时载入了两个项目: textfinder 和 stylesheet,并以 textfinder 工程 为当前工程(active project),点击 Dependencies 标签页,选中 stylesh

  • 我面临着以下问题。我有两个Gradle项目(ProjectA和ProjectB)在同一个层次结构上,没有任何根项目。由于ProjectA依赖于ProjectB,我尝试将其建模如下: ProjectA的settings.gradle: ProjectA的build.gradle: 然而,当我在ProjectA上执行gradle build时,我得到了以下错误: 我必须在ProjectB中定义某种默认

  • 因此,自从添加新的Room android架构库以来,这种情况已经开始发生。我在AppDatabase_Impl没有过期时遇到问题,我通过在注释中添加kapt来修复它: < li>Android Room持久性库和Kotlin < li >在Kotlin中实现房间持久性库 < in Kotlin中的房间持久性库实现(Gradle错误) 我怀疑其他错误是由于AS、Kotlin和Java 8造成的,所