如何使用CMake设置Visual Studio解决方案的程序集引用?

问题描述 投票:0回答:1

我正在使用C代码,其中生产编译器和CI在Linux上运行,但开发环境是Windows和VS。使用的测试框架是NUnit,它是用C#编写的,并通过Nuget作为DLL导入。

我习惯于用C语言编写面向目标的CMake,但是VS解决方案和.NET对我而言是未知领域,而C和C#的奇怪组合并没有使事情变得容易。使事情更加复杂的是,有一个工具可以为要运行C代码的平台代码生成模拟(我认为平台Mock是用C ++编写的。)>

因此,我正在使用CMake 3.15.3和Visual Studio 2017,而我需要开始的设置如下。顶部的CMakeLists.txt如:

cmake_minimum_required(VERSION 3.3) 
project(MyApplication)

include(SUTWrapper)

add_subdirectory(source)
add_subdirectory(suttest)

./ source /中的CMakeLists.txt:

find_package(PlatformInterface)

add_library(${CMAKE_PROJECT_NAME} STATIC
    MyApplication.c)

target_link_libraries(${CMAKE_PROJECT_NAME}
    PUBLIC
        PlatformInterface)

./ suttest /中的CmakeLists.txt,如:

enable_language(CSharp)

add_executable(${CMAKE_PROJECT_NAME}_tests
    MyApplication_suite1.cs
    Program.cs
    TestUtils.cs)

add_sut_wrapper()

add_test(
    NAME
        Test${CMAKE_PROJECT_NAME}
    COMMAND
        MyApplication_tests.exe
    CONFIGURATIONS
        Debug)

并且在包含所有CMake模块的cmake文件夹中,文件SUTWrapper.cmake:

function(add_sut_wrapper)
    set(PATH_TO_WRAPPER path/to/wrapper/here)
    add_library(${CMAKE_PROJECT_NAME}_wrapper STATIC
        ${PATH_TO_WRAPPER}/foo.cs
        ${PATH_TO_WRAPPER}/bar.cs
        ${PATH_TO_WRAPPER}/baz.cs)

    set_property(
        TARGET ${CMAKE_PROJECT_NAME}_wrapper
        PROPERTY
        VS_DOTNET_REFERENCES "System")

    set_property(
        TARGET ${CMAKE_PROJECT_NAME}_tests
        PROPERTY
            VS_PACKAGE_REFERENCES "NUnit_3.7.1;NUnitLite_3.7.2")

    set(PATH_TO_PLATFORM_MOCK path/to/PlatformMock/here/)
    add_library(${CMAKE_PROJECT_NAME}_Platform_Mock STATIC
        ${PATH_TO_PLATFORM_MOCK}/Swc_${CMAKE_PROJECT_NAME}.cpp)

    add_library(${CMAKE_PROJECT_NAME}_shared SHARED
        ../source/MyApplication.c)

    target_link_libraries(${CMAKE_PROJECT_NAME}_shared
        PUBLIC
            PlatformInterface
            ${CMAKE_PROJECT_NAME}_Platform_Mock)

    target_link_libraries(${CMAKE_PROJECT_NAME}_tests
        PUBLIC
            ${CMAKE_PROJECT_NAME}_shared)

endfunction()

然后cmake文件夹中还有另一个文件,FindPlatformInterface.cmake:

add_library(PlatformInterface INTERFACE)

target_include_directories(PlatformInterface 
    INTERFACE
        path/to/PlatformInterface/headers/here
        path/to/more/PlatformInterface/headers/here)

在PlatformInterface上对find_package的非常规使用是一种临时解决方法,而add_sut_wrapper函数是一种处理在构建此CMake项目之前已经生成大量包装代码的方法。我正在处理大量遗留问题,不得不进行一些奇怪的工作,很奇怪。

据我所知,NUnit安装程序希望将测试构建为链接到应用程序代码的DLL的可执行文件(该文件又与PlatformInterface,PlatformMock链接)。

这一切在运行CMake时都会生成VS解决方案,没有任何警告,但是当我尝试在VS中构建解决方案时,出现此错误:

错误CS0246,找不到类型或名称空间名称'Vector'(您是否缺少using指令或程序集参考?)MyApplication_tests

Vector是静态库中名为MyApplication_wrapper的名称空间。所以很明显,我链接了包含Vector的代码。之前,我通过命名空间为System并链接到NUnit遇到了类似的问题,我通过添加

解决了这个问题
set_property(
    TARGET ${CMAKE_PROJECT_NAME}_wrapper
    PROPERTY
    VS_DOTNET_REFERENCES "System")

set_property(
    TARGET ${CMAKE_PROJECT_NAME}_tests
    PROPERTY
        VS_PACKAGE_REFERENCES "NUnit_3.7.1;NUnitLite_3.7.2")

添加到功能add_sut_wrapper。我只是不知道如何为Vector添加程序集引用。

我不得不混淆名称和路径,我试图删除一些不相关的细节,但我认为要点在那里。

我正在使用C代码,其中生产编译器和CI在Linux上运行,但开发环境是Windows和VS。使用的测试框架是NUnit,它是用C#编写的,并以...

c# .net cmake nunit
1个回答
0
投票

如果要从Vector目标中访问MyApplication_tests名称空间,则必须link

© www.soinside.com 2019 - 2024. All rights reserved.