CMake 将所有 Target 的工程在 Visual Studio 中加到同一个文件夹

这篇具有很好参考价值的文章主要介绍了CMake 将所有 Target 的工程在 Visual Studio 中加到同一个文件夹。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

我想要将所有 Target 的工程在 Visual Studio 中加到同一个文件夹

一开始我想要重写 add_library 函数,来获取到那些 lib 添加了,进而获得所有的 library,存到一个 list 里面,最后对这个 list 遍历,设置 folder

# 3RD_PARTY_LIB_LIST stores all lib targets that have folder properity
set(3RD_PARTY_LIB_LIST "" CACHE INTERNAL "3RD_PARTY_LIB_LIST")

function(add_library name)
    _add_library(${name} ${ARGN}) 
    # if not Meow Editor, it is 3rd party library
    if(NOT name STREQUAL ${RUNTIME_NAME})
        if(TARGET ${name})
            # alias target can not call set_target_properties
            # interface library doesn't have folder property
            # so exclude them
            get_property(ALIAS TARGET "${name}" PROPERTY ALIASED_TARGET)
            if("${ALIAS}" STREQUAL "")
                get_target_property(3RD_PARTY_LIB_TYPE ${name} TYPE)
                if(NOT ("${3RD_PARTY_LIB_TYPE}" STREQUAL "INTERFACE_LIBRARY"))
                    message(STATUS "Find 3rd lib: ${name}")
                    set(3RD_PARTY_LIB_LIST ${3RD_PARTY_LIB_LIST} ${name} CACHE INTERNAL "3RD_PARTY_LIB_LIST")
                endif()
            endif()
        endif()
    endif()
endfunction()
# Set all 3rd party lib to one folder
foreach(3RD_PARTY_LIB ${3RD_PARTY_LIB_LIST})
    # I don't know why one name has passed if(TARGET ${name}) check
    # but still may not find target now in this line
    # so give this dirty check
    if(TARGET ${3RD_PARTY_LIB})
        get_property(OLD_FOLDER TARGET "${3RD_PARTY_LIB}" PROPERTY FOLDER)
        set_target_properties(${3RD_PARTY_LIB} PROPERTIES FOLDER "3rdparty/${OLD_FOLDER}")
    endif()
endforeach()

之后我发现还有 utility 类型的工程,我就觉得不能单单看 library 了,应该是要有一个方法找到所有 target,然后从中排除掉不需要的 target,将剩下的所有 target 的 folder 属性更改文章来源地址https://www.toymoban.com/news/detail-705191.html

function(get_all_targets var)
    set(targets)
    get_all_targets_recursive(targets ${CMAKE_CURRENT_SOURCE_DIR})
    set(${var} ${targets} PARENT_SCOPE)
endfunction()

macro(get_all_targets_recursive targets dir)
    get_property(subdirectories DIRECTORY ${dir} PROPERTY SUBDIRECTORIES)
    foreach(subdir ${subdirectories})
        get_all_targets_recursive(${targets} ${subdir})
    endforeach()

    get_property(current_targets DIRECTORY ${dir} PROPERTY BUILDSYSTEM_TARGETS)
    list(APPEND ${targets} ${current_targets})
endmacro()
# Set all 3rd party project to one folder
get_all_targets(ALL_TAR_LIST)
foreach(TAR ${ALL_TAR_LIST})
    if("${TAR}" STREQUAL "${RUNTIME_NAME}" OR "${TAR}" STREQUAL "${EDITOR_NAME}")
        continue()
    endif()

    # alias target can not call set_target_properties
    # interface library doesn't have folder property
    # so exclude them
    get_property(ALIAS TARGET "${TAR}" PROPERTY ALIASED_TARGET)
    if(NOT ("${ALIAS}" STREQUAL ""))
        continue()
    endif()
    get_target_property(3RD_PARTY_LIB_TYPE ${TAR} TYPE)
    if("${3RD_PARTY_LIB_TYPE}" STREQUAL "INTERFACE_LIBRARY")
        continue()
    endif()

    message(STATUS "Found target: ${TAR}")
    get_property(OLD_FOLDER TARGET "${TAR}" PROPERTY FOLDER)
    set_target_properties(${TAR} PROPERTIES FOLDER "3rdparty/${OLD_FOLDER}")
endforeach()

到了这里,关于CMake 将所有 Target 的工程在 Visual Studio 中加到同一个文件夹的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 如何链接多个modbus_tcp设备,并将设备数据写入同一个modbusSlave,以便外部客户端获取所有链接设备的数据。

    在modbus通信中,一个modbus服务器一次只能链接一个客户机,那么,外部客户端要获取多个设备的modbus数据,就需要使用链接一个专用的mosbus服务器,一下就是详细解决方法。 第一步:创建modbus客户端,链接一个modbus设备,然后再链接一个共有的modbus服务器,modbus客户端可以连

    2024年04月25日
    浏览(54)
  • visual studio 编译cmake项目

    当编译出现问题 message(FATAL_ERROR \\\"The C compilern  \\\"${CMAKE_C_COMPILER}\\\"n\\\"       \\\"is not able to compile a simple test program.nIt fails \\\"       \\\"with the following output:n  ${_output}nn\\\"       \\\"CMake will not be able to correctly generate this project.\\\") 控制台提示如下: 1 已为默认配置“x64-Debug”启动 CMake 生成

    2024年02月06日
    浏览(56)
  • 使用 Visual Studio Code 调试 CMake 脚本

    之前被引入到 Visual Studio 中的 CMake 调试器,现已在 Visual Studio Code 中可用。 也就是说,现在你可以通过在 VS Code 中安装 CMake 工具扩展,来调试你的 CMakeLists.txt 脚本了。是不是很棒? Visual C++ 开发团队和 CMake 的维护者 Kitware 一直密切合作,目的是将我们的 CMake 调试器实现集成

    2024年02月13日
    浏览(45)
  • Visual Studio 2022 cmake配置opencv开发环境

    这里我用的是 widnows 10 64位 , Visual Studio 用的 Visual Studio Community 2022 (社区版) 对于 Android 开发工程师来说,为什么要使用 Visual Studio 呢 ? 因为在 Visual Studio 中开发调试 OpenCV 方便,可以开发调试好后,再移植到 Android 中。 官方地址在这里 : 官方下载地址 不过官方下载地址可能

    2024年02月07日
    浏览(91)
  • Visual Studio 2022 CMake C++ Hello World

    C++自学精简教程 目录(必读) Visual Studio 2022 安装​​​​​​​ 什么是CMake CMake是跨平台的C/C++工程构建工具。 我们知道, 在Windows上用Visual Studio开发C/C++代码,工程文件是用.vcxproj文件来组织的; 在Linux上用gcc/g++开发C/C++代码,工程文件是用Makefile文件来组织的; 很多时候我

    2024年02月16日
    浏览(50)
  • Visual Studio Code系列--CMake Tools使用说明

            在linux系统上开发程序,一般都是使用vim+gcc+gdb进行的;但是为了开发效率我们也会使用Visual Studio Code进行开发,毕竟有界面的开发调试还是更加友好一些。         老牌程序员肯定都知道make构建工具,但是其晦涩的语法还是难住不少初级开发者的。那么有没有一种

    2024年02月12日
    浏览(83)
  • 同一个请求同一个参数,postman发送成功,jmeter失败

    当使用jmeter 请求时吗,注意请求参数中是否包含中文。 问题来由: 1.先用postman发送,成功。  2.一模一样,header一样,请求一样,但是就是一直查询不出来。 3.经过fiddler抓包,再次对比请求头,请求体,还是没有发现有什么差别。 4.猜想: 此接口其他参数传送,都没有问题

    2024年02月13日
    浏览(49)
  • QT转型Visual Studio(qmake项目到cmake项目的移植)

    由于工作需要,同时也为了方便以后的集成升级,希望将之前用Qt creator qmake开发的项目移植到cmake项目中,并使用Visual Studio 进行后续开发,本文主要用以记录该过程中的常规步骤和遇到的特殊情况。 在一开始,为了降低开发难度以及快速完成业务开发,我们使用Qt Creator原生

    2024年02月09日
    浏览(44)
  • Visual Studio 2022使用CMake+MinGW+Clang+LLDB作为开发环境

    笔者前面写了两篇关于Visual Studio 2022使用MinGW的博文:《Visual Studio 2022使用MinGW来编译调试C/C++程序》、《Visual Studio 2022 CMake+MinGW+GDB 调试目标程序》,这两篇博文都是介绍的是GCC+GDB的编译与调试,本文笔者介绍的则是Clang+LLDB的编译与调试。读完本文,读者可以在GCC、Clang与

    2024年02月06日
    浏览(65)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包