gpt4 book ai didi

CMake add_subdirectory()

转载 作者:行者123 更新时间:2023-12-01 13:00:09 24 4
gpt4 key购买 nike

简介:

我正在尝试使用 CMake 获取跨平台编译脚本(适用于 Windows32 上的 VS 9.0 和适用于 Unix 的 Makefile)。

我遇到了关于 add_subdirectory() 的一些我无法理解的事情。

让我向您展示我的代码:

上下文:

我的名为“module1”的模块的架构是这样的:

  • CMakeLists.txt
  • 包括/
  • 文件 1.h
  • 文件2.h
  • *.h
  • 源/
  • 文件 1.cpp
  • 文件2.cpp
  • *.cpp
  • 测试/
  • CMakeLists.txt
  • 源/
  • testfile1.cpp
  • testfile2.cpp

  • 我的整个应用程序的架构由这些模块组成,这些模块本身就是可以独立工作的项目。

    我的目标:
  • 我想将我的模块编译为库
  • 我想用 test/文件夹中的代码测试库

  • 这是我写的 CMakeLists:

    这个是我模块根目录下的CMakeLists.txt。
    #ENSURE MINIMUM VERSION OF CMAKE
    cmake_minimum_required(VERSION 2.8)

    #CONFIGURATION OF THE PROJECT
    #NAME OF THE PROJECT
    project(MyProject)

    #OUTPUT OF THE PROJECT
    set(LIBRARY_OUTPUT_PATH lib/${CMAKE_BUILD_TYPE})

    #ADD THE HEADERS OF THE LIBRARY BEING CREATED
    include_directories(include)

    #ADD 3rd PARTY OPENCV LIBRARIES
    find_package(OpenCV REQUIRED)

    #ADD 3rd PARTY XERCES LIBRARIES
    include_directories(${XERCES_INCLUDE_DIR})
    link_directories(${XERCES_LIB_DIR})
    set(Xerces_LIBS xerces-c_3D.lib)


    #CONFIGURATION OF THE LIBRARY
    file(GLOB_RECURSE MYPROJECT_MODULE_CXX src/*)
    file(GLOB_RECURSE MYPROJECT_MODULE_HDR include/*)

    #NAME OF THE PRESENT LIBRARY
    set(MYPROJECT_MODULE_LIB_NAME myModuleLib)
    add_library(${MYPROJECT_MODULE_LIB_NAME}
    SHARED
    ${MYPROJECT_MODULE_CXX}
    ${MYPROJECT_MODULE_HDR}
    )
    target_link_libraries(${MYPROJECT_MODULE_LIB_NAME}
    ${OpenCV_LIBS}
    ${Xerces_LIBS}
    )

    #CONTINUE IN THE SUB FOLDERS
    add_subdirectory(test)

    然后,在 test/文件夹中,这里是 CMakeLists.txt
    #ENSURE MINIMUM VERSION OF CMAKE
    cmake_minimum_required(VERSION 2.8)

    #CONFIGURATION OF THE PROJECT
    #NAME OF THE PROJECT
    project(MyProjectTest)

    #OUTPUT OF THE PROJECT
    set(EXECUTABLE_OUTPUT_PATH bin/${CMAKE_BUILD_TYPE})

    #ADD OUR TESTED LIBRARY
    include_directories(../include)
    link_directories(../build/lib/${CMAKE_BUILD_TYPE})


    #CONFIGURATION OF THE EXE
    file(GLOB_RECURSE MYPROJECT_MODULE_TEST_CXX src/*)

    #NAME OF THE PRESENT EXECUTABLE
    set(MYPROJECT_MODULE_TEST_BIN_NAME myModuleTest)
    add_executable(${MYPROJECT_MODULE_TEST_BIN_NAME}
    ${MYPROJECT_MODULE_TEST_CXX}
    )
    target_link_libraries(${MYPROJECT_MODULE_TEST_BIN_NAME}
    ${MYPROJECT_MODULE_LIB_NAME}
    )

    问题

    CMake 输出正确的 MyProject.sln Visual Studio 9.0 解决方案,该解决方案在我与 OpenCV 和 Xerces(以及其他第 3 部分库)链接的库中成功编译。但是,测试二进制文件没有输出任何 MyProjectTest.sln。

    我想,( and read in the CMake documentation ) add_subdirectory(dir) 用于在以下子目录中执行 CMake(我的意思是,名称不能更清楚:p !),所以它不应该在 test/目录中继续 CMake并创建我的 MyProjectTest.sln 解决方案?

    我使用 GUI CMake 在我在模块根目录中创建的构建目录中运行根 CMakeLists.txt。当我探索构建目录时,我可以在其中找到 MyProjet.sln,一个 test/文件夹,但其中没有 MyProjectTest.sln!

    最佳答案

    这可能无法解决您最初的问题,但在您的 test/folder/CMakeLists.txt 中尝试改变

    #ADD OUR TESTED LIBRARY
    include_directories(../include)
    link_directories(../build/lib/${CMAKE_BUILD_TYPE})


    #ADD OUR TESTED LIBRARY
    include_directories(${CMAKE_SOURCE_DIR}/include)
    link_directories(${CMAKE_BINARY_DIR}/lib/${CMAKE_BUILD_TYPE})

    否则你假设你的构建文件夹总是被命名为 build .

    关于CMake add_subdirectory(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6747856/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com