【问题标题】:Set solution folder property in CMake for 3rd-party library在 CMake 中为 3rd-party 库设置解决方案文件夹属性
【发布时间】:2014-09-11 08:04:26
【问题描述】:

我的项目依赖于一个大型的 3rd 方库 (OpenMVG)。 目前它没有安装。官方搭建说明推荐使用add_subdirectory

因此我的CMakeLists.txt 包含以下几行

add_subdirectory(${OpenMVG_DIR}/src "${CMAKE_BINARY_DIR}/openMVG")
include_directories(${OpenMVG_INCLUDES})
add_executable(f_matching f_matching.cpp)
target_link_libraries(f_matching ${OpenMVG_LIBS})

我的平台是 Visual Studio,生成的解决方案在顶层包含 72 个项目。我想使用FOLDER CMake 属性在层次结构中组织它。例如,我想将所有 OpenMVG 的项目移动到单独的 VS 解决方案文件夹中。

但是,正如 CMake 文档所述,此属性只能分配给目标,而不能分配给目录。 我的CMakeLists.txt 包含

set_property(DIRECTORY ${OpenMVG_DIR}/src PROPERTY FOLDER OpenMVG)

但是这条线什么也不做,没有解决方案文件夹出现。 我尝试通过在目标上设置 FOLDER 属性来修改几个 OpenMVG 的 CMakeLists,这很有效。

在不从 OpenMVG 更改 CMakeLists 的情况下,是否有针对这种情况的解决方法? 目前,我想把时间花在其他任务上,并将这个简单的编辑推迟到以后。

【问题讨论】:

  • 从您自己的 CMakeLists 中为所有 72 个 OpenMVG 目标调用 set_property 有什么问题?当然,这有点乏味,但你只需要做一次。
  • 是的,没有错。已经这样做了。

标签: visual-studio cmake


【解决方案1】:

有一种“技巧”可以实现您的目标。 'add_library'的原始版本带有下划线前缀,因此您可以通过这种方式重新实现顶级'add_library'函数:

set_property(GLOBAL PROPERTY USE_FOLDERS ON)

# you need it to properly set variable from function() call
set(target_list "" CACHE INTERNAL "target_list")
function(add_library name)
    message("Adding library ${name}")
    set(target_list ${target_list} ${name} CACHE INTERNAL "target_list")
    _add_library(${name} ${ARGN})
endfunction()

# Your add_subdirectory() goes here

set_target_properties(${target_list} PROPERTIES FOLDER "OpenMVG")

当然,据我所知,它没有文档记录,也不是官方的,但它可以工作,至少现在使用 CMake 2.8.12.2。

【讨论】:

    猜你喜欢
    • 2011-01-18
    • 1970-01-01
    • 2017-08-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多