2014-09-11 79 views
3

我的项目依赖于大型第三方库(OpenMVG)。 目前尚未安装。官方建筑说明建议与add_subdirectory一起使用。在CMake中为第三方库设置解决方案文件夹属性

因此我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? 目前,我想花时间完成其他任务,并推迟将来进行简单编辑。

+1

从你自己的CMakeLists调用所有72个OpenMVG目标的'set_property'有什么问题?当然,这有点乏味,但你只需要做一次。 – ComicSansMS 2014-09-11 08:39:07

+0

是的,没有错。已经这样做了。 – wl2776 2014-09-11 09:17:41

回答

0

有一个'黑客'来实现你的目标。 “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。

相关问题