Visual studio 2015 具有多个相互依赖项目的CMake

Visual studio 2015 具有多个相互依赖项目的CMake,visual-studio-2015,cmake,Visual Studio 2015,Cmake,我的团队正在讨论将我们的开发环境迁移到CMake。我们的软件(大部分)由两个主要应用程序组成: ProcessingHub-从传感器获取信息,对其进行处理并广播 客户端从ProcessingHub接收数据广播,并提供友好的API来检索数据 除了许多其他项目外,这两个软件都使用静态库作为操作系统接口层;我叫它OsInterfaceLib ProcessingHub还使用了另外两个被认为是独立库的静态库,因为它们不仅仅用于ProcessingHub。我将它们称为ProcessingLib和Senso

我的团队正在讨论将我们的开发环境迁移到CMake。我们的软件(大部分)由两个主要应用程序组成:

ProcessingHub-从传感器获取信息,对其进行处理并广播

客户端从ProcessingHub接收数据广播,并提供友好的API来检索数据

除了许多其他项目外,这两个软件都使用静态库作为操作系统接口层;我叫它OsInterfaceLib

ProcessingHub还使用了另外两个被认为是独立库的静态库,因为它们不仅仅用于ProcessingHub。我将它们称为ProcessingLib和SensorLib

我们的SVN结构如下:

  • 树干
    • 加工中心
    • 客户
    • OsInterfaceLib
    • 处理库
    • 传感器库
我们的磁盘工作区完全镜像了SVN

目前,我们分别针对Windows和Linux使用签入式Visual Studio和Eclipse项目。在Windows上,ProcessingLib必须使用Clang构建。Windows是我们的主要平台,ProcessingHub/Client都有VS解决方案,其中包含必要的依赖项目,因为所有这些项目都在不断发展,能够无缝地调试项目是至关重要的

我花了整整一周的时间研究CMake,要让CMake生成一个包含所有相关项目的VS解决方案,似乎唯一的方法就是对每个依赖项使用
add\u子目录
命令。这在ProcessingLib中失败,因为它必须使用与其他工具链不同的工具链构建。据我所知,工具链只能在调用cmake时设置,因此从顶级ProcessingHub或客户端CMakeLists.txt一次生成所有内容是行不通的

我的问题是:是让我们的项目保持他们更好的声音,还是有干净、简单的方法让我们制作:

  • 生成ProcessingHub和客户端解决方案,解决方案资源管理器中已有必要的依赖项目
  • 对OsInterfaceLib使用相同的源代码和生成的项目文件
  • 不需要重组我们的SVN/签出工作区

  • 可以通过变量设置C++编译器,但是注意这必须在任何代码>项目()/<代码>或<代码> Enable语言()/<代码>命令> /< P>之前完成。 一种简单的方法是在子目录中调用

    project()

    顶级CMakeLists.txt:

    add_subdirectory(ProcessingLib)
    add_subdirecdory(Others)
    
    set(CMAKE_CXX_COMPILER /path/to/clang)
    project(ProcessingLib)
    
    ...
    
    project(Others)
    
    ...
    
    ProcessingLib CMakeLists.txt:

    add_subdirectory(ProcessingLib)
    add_subdirecdory(Others)
    
    set(CMAKE_CXX_COMPILER /path/to/clang)
    project(ProcessingLib)
    
    ...
    
    project(Others)
    
    ...
    
    其他CMakeLists.txt:

    add_subdirectory(ProcessingLib)
    add_subdirecdory(Others)
    
    set(CMAKE_CXX_COMPILER /path/to/clang)
    project(ProcessingLib)
    
    ...
    
    project(Others)
    
    ...
    
    但是,在文档中查找以下内容:

    项目的顶级
    CMakeLists.txt
    文件必须包含对命令的文本直接调用;通过命令加载一个是不够的。如果不存在此类调用,CMake将在顶部隐式添加一个调用,以启用默认语言(
    C
    CXX

    因此,您最好将
    ProcessingLib
    构建为一个而不是一个子目录:

    include(ExternalProject)
    ExternalProject_Add(ProcessingLib
        SOURCE_DIR /path/to/ProcessingLib
        CMAKE_ARGS -DCMAKE_CXX_COMPILER=/path/to/clang
    )
    

    如果在
    ExternalProject\u Add
    命令中指定
    CMAKE\u GENERATOR
    CMAKE\u ARGS
    ,则此操作有效<代码>添加库(静态导入的也需要建立可链接到可执行文件的目标。但是,在导入的libs上生成的vcxproj似乎是一个仅在其目录上运行cmake的shell-解决方案资源管理器中未填充任何源、头和资源筛选器