在win10上借助WSL用VS2019开发跨平台项目实例

在win10上借助适用于 Linux 的 Windows 子系统(WSL)用VS2019开发跨平台项目实例,详细步骤,手把手教学。(初次学习,若有错误,欢迎辅正)

前提是这些环境都搭好了,可参考:在 Windows 上安装 Linux_适用于 linux 的 windows 子系统 2.6.3-CSDN博客

在 Visual Studio 中安装 C++ Linux 工作负载-CSDN博客

用windows10的linux子系统在visual studio2019中用C语言开发linux项目-CSDN博客

开发linux项目-在 Windows 上 基于"适用于 Linux 的 Windows 子系统(WSL)"-CSDN博客

一、规划项目结构:

二、根目录下关键文件

1、README.md

cpp 复制代码
\# Linux SysInfo 跨平台项目

D:\\Projects\\crossPlatformSysInfo\\

crossPlatformSysInfo/
├── Sysinfo/
│   ├── src/ # 源码目录
│   │   ├── module1.cpp
│   │   ├── module2.cpp
│   ├── include/  # 头文件目录
│   │   ├── module1.h
│   │   ├── module2.h
│   │   └── mylib.h
│   └── CMakeLists.txt
├── out/  # 构建目录(VS 会自动创建)
├── tests/  # 测试目录
│    ├── test1.h
│    ├── test1.cpp
│    ├── test_main.cpp
│    └── CMakeLists.txt
├── CMakeLists.txt
└── README.md


\## 项目描述

这是一个跨平台的系统信息获取库,支持 Windows 和 Linux。


\## 编译说明

\### Windows (Visual Studio 2019)

1\. 用 VS2019 打开 CMakeLists.txt

2\. 选择配置(x64-Debug 或 x64-Release)

3\. 生成解决方案



\### Linux

```bash

mkdir build

cd build

cmake ..

make

2、CMakeLists.txt

根目录下的 CMakeLists.txt (D:\cppTest\crossPlatformSysInfo)

cpp 复制代码
# 顶层CMakeLists.txt
cmake_minimum_required(VERSION 3.10)
# 项目名称(自定义,支持中文,VS中显示的项目名称)
project(crossPlatformSysInfo)

# 设置 C/C++ 标准(跨平台统一标准,可选C++11/C++14/C++17)
set(CMAKE_C_STANDARD 11)
set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON) # 强制使用指定的C++标准
set(CMAKE_CXX_EXTENSIONS OFF)       # 禁用编译器特有扩展,提升跨平台兼容性

# ==================== 诊断信息开始 ====================
message(STATUS "========================================")
message(STATUS "CMake系统变量诊断信息:")
message(STATUS "CMAKE_SYSTEM_NAME: ${CMAKE_SYSTEM_NAME}")
message(STATUS "CMAKE_SYSTEM_VERSION: ${CMAKE_SYSTEM_VERSION}")
message(STATUS "CMAKE_SYSTEM_PROCESSOR: ${CMAKE_SYSTEM_PROCESSOR}")
message(STATUS "WIN32: ${WIN32}")
message(STATUS "UNIX: ${UNIX}")
message(STATUS "APPLE: ${APPLE}")
message(STATUS "MSVC: ${MSVC}")
message(STATUS "CMAKE_HOST_SYSTEM_NAME: ${CMAKE_HOST_SYSTEM_NAME}")
message(STATUS "========================================")
# ==================== 诊断信息结束 ====================
# 平台检测
message(STATUS "Platform: ${CMAKE_SYSTEM_NAME}")
if(WIN32)
    message(STATUS "Building for Windows")
    add_definitions(-DPLATFORM_WINDOWS)
elseif(UNIX AND NOT APPLE)
    message(STATUS "Building for Linux")
    add_definitions(-DPLATFORM_LINUX)
else()
    message(FATAL_ERROR "Unsupported platform")
endif()


# 设置统一输出目录(可选,指定可执行文件和库的输出路径,避免分散)
set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin)  # 动态库输出目录
set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin)  # 静态库输出目录
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin)  # 可执行文件输出目录

# 添加子目录(按顺序添加,先构建库,再构建测试程序)
add_subdirectory(MTSysinfo)

# 可选:添加测试
option(BUILD_TESTS "Build tests" ON)
if(BUILD_TESTS)
    enable_testing()
    # 添加子目录
    add_subdirectory(tests)
endif()

# 安装规则
install(DIRECTORY MTSysinfo/include/ DESTINATION include)

三、项目库关键文件(D:\cppTest\crossPlatformSysInfo\Sysinfo)

Sysinfo文件夹下:

1、include 文件夹

sysinfo.h 文件
cpp 复制代码
// crossPlatformSysInfo.h: 标准系统包含文件的包含文件
// 或项目特定的包含文件。
#pragma once

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define DLL_EXPORT
#if defined(__cplusplus) || defined(__cplusplus__)
extern "C" {
#endif

#if defined(_WIN32) || defined(_WIN64)
#define PLATFORM_WINDOWS 1
#include <windows.h>
//#define snprintf _snprintf
#include <psapi.h>
#include <tlhelp32.h>
#include <VersionHelpers.h>  // 需要 Windows 8.1 SDK 或更高版本
#include <strsafe.h>
#include <ntstatus.h>
#include <winternl.h>
#else
#define PLATFORM_LINUX 1
#define Sleep sleep
#include <sys/utsname.h>
#include <sys/sysinfo.h>
#include <unistd.h>
#include <sys/types.h>
#endif

/*  Handle DSO symbol visibility  */
#if defined MTSYSINFO_NO_EXPORT
#define MTSYSINFO_EXPORT
#else
#if defined _WIN32
#if defined MTSYSINFO_STATIC
#define MTSYSINFO_EXPORT
#elif defined DLL_EXPORT
#define MTSYSINFO_EXPORT __declspec(dllexport)
#else
#define MTSYSINFO_EXPORT __declspec(dllimport)
#endif
#else
#if defined __SUNPRO_C || defined __SUNPRO_CC
#define MTSYSINFO_EXPORT __global
#elif (defined __GNUC__ && __GNUC__ >= 4) || defined __INTEL_COMPILER
#define MTSYSINFO_EXPORT __attribute__ ((visibility ("default")))
#else
#define MTSYSINFO_EXPORT
#endif
#endif
#endif


// 系统信息结构体
typedef struct {
    char sysname[256];    // 操作系统名称
    char nodename[256];   // 主机名/网络节点名
    char release[256];    // 内核版本
    char version[256];    // 操作系统版本
    char machine[256];    // 硬件架构
    long uptime;          // 系统运行时间(秒)
    double load_avg[3];   // 系统负载(1,5,15分钟)(仅Linux)
    unsigned long long total_memory;   // 总内存(KB)
    unsigned long long free_memory;    // 可用内存(KB)
    int cpu_count;    // CPU核心数
} SystemInfo;

// 跨平台函数声明
MTSYSINFO_EXPORT int get_system_info(SystemInfo* info);
MTSYSINFO_EXPORT void print_system_info(const SystemInfo* info);
MTSYSINFO_EXPORT const char* get_distribution_name();
MTSYSINFO_EXPORT const char* get_platform_name();



#if defined(__cplusplus) || defined(__cplusplus__)
}
#endif

2、src 文件夹

sysinfo.cpp 文件
cpp 复制代码
// crossPlatformSysInfo.cpp: 定义应用程序的入口点。
//

#include "sysinfo.h"


// 获取平台名称
MTSYSINFO_EXPORT const char* get_platform_name() 
{
#if PLATFORM_WINDOWS
    return "Windows";
#elif PLATFORM_LINUX
    return "Linux";
#else
    return "Unknown";
#endif
}

#ifdef _WIN32
// Windows 平台获取系统信息
MTSYSINFO_EXPORT int get_system_info(SystemInfo* info) 
{
    if (!info) return -1;
    // 初始化结构体
    memset(info, 0, sizeof(SystemInfo));

    //// 获取操作系统信息
    // 填充系统名称
    snprintf(info->sysname, sizeof(info->sysname), "Windows");
    // 获取更具体的Windows版本
    if (IsWindowsServer()) {
        strncat(info->sysname, " Server", sizeof(info->sysname) - strlen(info->sysname) - 1);
    }
    // 获取计算机名
    char computer_name[MAX_COMPUTERNAME_LENGTH + 1] = { 0 };
    DWORD size = sizeof(computer_name);
    if (GetComputerNameA(computer_name, &size)) {
        strncpy(info->nodename, computer_name, sizeof(info->nodename) - 1);
    }
    else {
        strncpy(info->nodename, "Unknown", sizeof(info->nodename) - 1);
    }
    // 获取Windows版本信息 - 使用RtlGetVersion避免兼容性层
    HMODULE hNtdll = GetModuleHandleW(L"ntdll.dll");
    if (hNtdll) {
        typedef NTSTATUS(WINAPI* RTLGETVERSION)(PRTL_OSVERSIONINFOW);
        RTLGETVERSION pRtlGet

                // 获取产品名称(Windows 10, Windows 11等)
                const char* productName = "Windows";
                if (osvi.dwMajorVersion == 10 && osvi.dwMinorVersion == 0) {
                    if (osvi.dwBuildNumber >= 22000) {
                        productName = "Windows 11";
                    }
                    else {
                        productName = "Windows 10";
                    }
                }
                else if (osvi.dwMajorVersion == 6) {
                    switch (osvi.dwMinorVersion) {
                    case 3: productName = "Windows 8.1"; break;
                    case 2: productName = "Windows 8"; break;
                    case 1: productName = "Windows 7"; break;
                    case 0: productName = "Windows Vista"; break;
                    }
                }
                else if (osvi.dwMajorVersion == 5) {
                    switch (osvi.dwMinorVersion) {
                    case 2: productName = "Windows Server 2003"; break;
                    case 1: productName = "Windows XP"; break;
                    }
                }
                // 检查是否是服务器版本
                BOOL isServer = FALSE;
                DWORD productType;
                DWORD bufSize = 0;
                if (GetProductInfo(osvi.dwMajorVersion, osvi.dwMinorVersion,
                    osvi.dwBuildNumber, 0, &productType)) {
                    isServer = (productType >= PRODUCT_STANDARD_SERVER &&
                        productType <= PRODUCT_DATACENTER_SERVER_CORE);
                }

                if (isServer) {
                    snprintf(info->version, sizeof(info->version), "%s Server %d.%d.%d",
                        productName, osvi.dwMajorVersion,
                        osvi.dwMinorVersion, osvi.dwBuildNumber);
                }
                else {
                    snprintf(info->version, sizeof(info->version), "%s %d.%d.%d",
                        productName, osvi.dwMajorVersion,
                        osvi.dwMinorVersion, osvi.dwBuildNumber);
                }
            }
        }
    }

    // 获取处理器架构
    SYSTEM_INFO sys_info;
    GetSystemInfo(&sys_info);
    const char* arch_str = "Unknown";
    switch (sys_info.wProcessorArchitecture) {
    case PROCESSOR_ARCHITECTURE_INTEL: arch_str = "x86"; break;
    case PROCESSOR_ARCHITECTURE_AMD64: arch_str = "x86_64"; break;
    case PROCESSOR_ARCHITECTURE_ARM: arch_str = "ARM"; break;
    case PROCESSOR_ARCHITECTURE_ARM64: arch_str = "ARM64"; break;
    }
    strncpy(info->machine, arch_str, sizeof(info->machine) - 1);
    info->machine[sizeof(info->machine) - 1] = '\0';

    // 获取启动时间
    info->uptime = GetTickCount64() / 1000; // 转换为秒

    // 获取内存信息
    MEMORYSTATUSEX mem_status;
    mem_status.dwLength = sizeof(mem_status);
    GlobalMemoryStatusEx(&mem_status);

    info->total_memory = mem_status.ullTotalPhys / (1024 * 1024); // 转换为MB
    info->free_memory = mem_status.ullAvailPhys / (1024 * 1024);  // 转换为MB

    // 获取CPU核心数
    info->cpu_count = sys_info.dwNumberOfProcessors;

    // Windows上不提供负载平均值
    info->load_avg[0] = info->load_avg[1] = info->load_avg[2] = 0.0;

    return 0;
}


// Windows 平台获取发行版名称(返回Windows版本信息)
MTSYSINFO_EXPORT const char* get_distribution_name() 
{
    static char distro[128] = "Windows";
    //static __declspec(thread) char distro[128] = "Windows"; // 使用线程局部存储避免竞争
    
    //// 使用RtlGetVersion作为GetVersionEx的更可靠替代
    HMODULE hNtDll = GetModuleHandleW(L"ntdll.dll");
    if (hNtDll)
    {
        typedef NTSTATUS(WINAPI* RTLGETVERSION)(PRTL_OSVERSIONINFOW);//声明未文档化的函数
        RTLGETVERSION pRtlGetVersion = (RTLGETVERSION)GetProcAddress(hNtDll, "RtlGetVersion");

        if (pRtlGetVersion) {
            RTL_OSVERSIONINFOW osvi = { 0 };
            osvi.dwOSVersionInfoSize = sizeof(osvi);

            if (pRtlGetVersion(&osvi) == STATUS_SUCCESS) {
                // 获取产品名称(Windows 10, Windows 11等)
                const char* productName = "Windows";
                if (osvi.dwMajorVersion == 10 && osvi.dwMinorVersion == 0) {
                    if (osvi.dwBuildNumber >= 22000) {
                        productName = "Windows 11";
                    }
                    else {
                        productName = "Windows 10";
                    }
                }
                else if (osvi.dwMajorVersion == 6) {
                    switch (osvi.dwMinorVersion) {
                    case 3: productName = "Windows 8.1"; break;
                    case 2: productName = "Windows 8"; break;
                    case 1: productName = "Windows 7"; break;
                    case 0: productName = "Windows Vista"; break;
                    }
                }
                else if (osvi.dwMajorVersion == 5) {
                    switch (osvi.dwMinorVersion) {
                    case 2: productName = "Windows Server 2003"; break;
                    case 1: productName = "Windows XP"; break;
                    }
                }

                // 检查是否是服务器版本
                BOOL isServer = FALSE;
                DWORD productType;
                DWORD bufSize = 0;
                if (GetProductInfo(osvi.dwMajorVersion, osvi.dwMinorVersion,
                    osvi.dwBuildNumber, 0, &productType)) {
                    isServer = (productType >= PRODUCT_STANDARD_SERVER &&
                        productType <= PRODUCT_DATACENTER_SERVER_CORE);
                }
                if (isServer) {
                    snprintf(distro, sizeof(distro), "%s Server %d.%d.%d",
                        productName, osvi.dwMajorVersion,
                        osvi.dwMinorVersion, osvi.dwBuildNumber);
                }
                else {
                    snprintf(distro, sizeof(distro), "%s %d.%d.%d",
                        productName, osvi.dwMajorVersion,
                        osvi.dwMinorVersion, osvi.dwBuildNumber);
                }
                return distro;
            }
        }
    }
    // 回退方案
    strncpy(distro, "Windows", sizeof(distro));///*/

    return distro;
}
#else
// Linux 平台获取系统信息
// 获取系统信息
MTSYSINFO_EXPORT int get_system_info(SystemInfo* info) 
{
    if (!info) return -1;

    struct utsname uts;
    if (uname(&uts) != 0) {
        perror("uname failed");
        return -1;
    }

    // 复制系统信息 - 确保字符串正确终止
    strncpy(info->sysname, uts.sysname, sizeof(info->sysname) - 1);
    info->sysname[sizeof(info->sysname) - 1] = '\0';

    strncpy(info->nodename, uts.nodename, sizeof(info->nodename) - 1);
    info->nodename[sizeof(info->nodename) - 1] = '\0';

    strncpy(info->release, uts.release, sizeof(info->release) - 1);
    info->release[sizeof(info->release) - 1] = '\0';
    strncpy(info->version, uts.version, sizeof(info->version) - 1);
    info->version[sizeof(info->version) - 1] = '\0';
    strncpy(info->machine, uts.machine, sizeof(info->machine) - 1);
    info->machine[sizeof(info->machine) - 1] = '\0';
    // 获取系统运行时间和负载
    struct sysinfo si;
    if (sysinfo(&si) == 0) {
        info->uptime = si.uptime;
        info->load_avg[0] = (double)si.loads[0] / (1 << SI_LOAD_SHIFT);
        info->load_avg[1] = (double)si.loads[1] / (1 << SI_LOAD_SHIFT);
        info->load_avg[2] = (double)si.loads[2] / (1 << SI_LOAD_SHIFT);
        info->total_memory = si.totalram / 1024; // 转换为KB
        info->free_memory = si.freeram / 1024; // 转换为KB
    }

    // 获取CPU核心数
    info->cpu_count = sysconf(_SC_NPROCESSORS_ONLN);

    return 0;
}

// 获取 Linux 发行版名称
MTSYSINFO_EXPORT const char* get_distribution_name() 
{
    static char distro[128] = "Unknown";
    FILE* fp = popen("lsb_release -ds 2>/dev/null || cat /etc/*-release 2>/dev/null | head -n1", "r");

    if (fp) {
        if (fgets(distro, sizeof(distro) - 1, fp)) {
            // 移除换行符
            distro[strcspn(distro, "\n")] = '\0';
        }
        pclose(fp);
    }

    return distro;
}
#endif

// 打印系统信息
MTSYSINFO_EXPORT void print_system_info(const SystemInfo* info) 
{
    if (!info) return;

#ifdef _WIN32
    printf("\n========== Windows 系统信息 ==========\n");
#else
    printf("\n========== Linux 系统信息 ==========\n");
#endif
    printf("平台: %s\n", get_platform_name());
    printf("操作系统: %s\n", info->sysname);
    printf("发行版本: %s\n", get_distribution_name());
    printf("主机名称: %s\n", info->nodename);
    printf("内核版本: %s\n", info->release);
    printf("系统架构: %s\n", info->machine);
    printf("CPU核心数: %d\n", info->cpu_count);

#if PLATFORM_WINDOWS
    printf("Windows 内核版本: %s\n", info->version);
#elif PLATFORM_LINUX
    printf("Linux 内核版本: %s\n", info->version);
#endif
    printf("\n");

    // 转换运行时间为可读格式
    long days = info->uptime / (24 * 3600);
    long hours = (info->uptime % (24 * 3600)) / 3600;
    long minutes = (info->uptime % 3600) / 60;
    long seconds = info->uptime % 60;

    printf("系统运行时间: %ld天 %ld小时 %ld分 %ld秒\n",
        days, hours, minutes, seconds);

    printf("系统负载 (1, 5, 15分钟): %.2f, %.2f, %.2f\n",
        info->load_avg[0], info->load_avg[1], info->load_avg[2]);

    printf("内存使用: %.1f MB / %.1f MB (可用/总共)\n",
        (info->total_memory - info->free_memory) / 1024.0,
        info->total_memory / 1024.0);
    printf("====================================\n");
}

3、CMakeLists.txt 文件

CMakeLists.txt 文件
cpp 复制代码
# 最低CMake版本要求
cmake_minimum_required(VERSION 3.10) 

# 项目名称,编译好dll或exe的名称
project(MTSysinfo)

set(PRODUCT_NAME "MTSysinfo")
set(LegalCopyRight  "Copyright(C) 2023/12/20")
set(COMPANY_NAME "VTECHSEMI")
set(MY_PRODUCT_NUMBER 12)
set(MY_PRODUCT_VERSION 31)
set(MY_BUILD_NUMBER 2025)
set(PRODUCT_VERSION ${MY_PRODUCT_NUMBER}.${MY_PRODUCT_VERSION}.${MY_BUILD_NUMBER})

# 设置 C/C++ 标准(跨平台统一标准,可选C++11/C++14/C++17)
set(CMAKE_C_STANDARD 11)
set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON) # 强制使用指定的C++标准
set(CMAKE_CXX_EXTENSIONS OFF)       # 禁用编译器特有扩展,提升跨平台兼容性

# 包含头文件目录
# system .h
include_directories(${CMAKE_CURRENT_SOURCE_DIR}/include)
# current .h
file(GLOB_RECURSE INCLUDES ${CMAKE_CURRENT_SOURCE_DIR}/include/*.h)
## current .cpp
file(GLOB SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/src/*.cpp)

## 收集所有源文件
#set(SOURCES
#    # 源文件列表
#    src/compareFloat.cpp
#    src/sysinfo.cpp
#)

#################################
## 创建静态库
#add_library(${PROJECT_NAME} STATIC
#    # 源文件列表
#    ${SOURCES}
#)
# 创建动态库  # mydll.dll 和 mydll.lib 会被生成
add_library(${PROJECT_NAME} SHARED
    # 源文件列表
    ${SOURCES}
)

# 平台特定的链接库
if(WIN32)
    message(STATUS "Start win32 cmake...")
    # Windows需要链接advapi32获取系统信息
    target_link_libraries(${PROJECT_NAME} PRIVATE advapi32)
    target_link_libraries(MTSysinfo ${LINK_LIBS})
    INSTALL(TARGETS MTSysinfo DESTINATION  ${CMAKE_CURRENT_SOURCE_DIR}/lib)
    # set target param
    SET_TARGET_PROPERTIES(${PROJECT_NAME} PROPERTIES LINKER_LANGUAGE CXX
                ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin      # 导入库(.lib)输出目录
                LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin      # DLL输出目录
                RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin      # 可执行文件输出目录
                OUTPUT_NAME "MTSysinfo"
                PREFIX "")
elseif(UNIX AND NOT APPLE)
    message(STATUS "Start Linux cmake...")
    # Linux不需要特殊链接库
    # 可以添加数学库如果需要:target_link_libraries(${PROJECT_NAME} m)
    
    ## create .so
    #add_library(MTSysinfo SHARED ${INCLUDES} ${SOURCES})
    #target_compile_definitions(MTSysinfo PRIVATE MTSysinfo_LIBRARY)
    #SET_TARGET_PROPERTIES(MTSysinfo PROPERTIES VERSION ${PRODUCT_VERSION} SOVERSION 1)
endif()

# 库文件不需要设置后缀,CMake会自动使用平台默认的库扩展名
# Windows: .lib 或 .dll, Linux: .so 或 .a

# 安装规则(可选)
install(TARGETS ${PROJECT_NAME}
    LIBRARY DESTINATION bin      # Windows上DLL放在bin目录,Linux上SO放在lib目录
    ARCHIVE DESTINATION bin      # Windows上导入库.lib文件放在lib目录
    RUNTIME DESTINATION bin      # Windows上可执行文件和DLL都放在bin目录
)
################################################################

四、tests 文件夹下

1、test_main.cpp

cpp 复制代码
#include <cstdio>

#include <stdio.h>
#include "sysinfo.h"


int main()
{
	printf("Hello CMake.\n");

    SystemInfo sys_info;
#ifdef _WIN32
    printf("Windows 系统信息查看器 v2.0\n");
#else
    printf("Linux 系统信息查看器 v2.0\n");
#endif
    printf("%s 系统信息查看器 v2.0 (跨平台版)\n", get_platform_name());
    printf("正在获取系统信息...\n");
    // 获取系统信息
    if (get_system_info(&sys_info) != 0) {
        fprintf(stderr, "错误: 无法获取系统信息\n");
        return 1;
    }
    // 打印系统信息
    print_system_info(&sys_info);
#ifdef _WIN32
    // Windows特有功能
    printf("\nWindows特定信息:\n");
    system("systeminfo | findstr /B /C:\"OS 名称\" /C:\"系统类型\"");
#else
    // Linux特有功能:显示内核模块信息
    printf("\n正在检查内核模块数量...\n");
    system("lsmod | wc -l | awk '{print \"已加载内核模块: \" $1-1}'");
#endif


	printf("%s 向你问好!\n", "LinuxSysInfo");
    system("pause");
	return 0;
}

2、CMakeLists.txt 文件

cpp 复制代码
# 最低CMake版本要求
cmake_minimum_required(VERSION 3.10) 

# 测试项目的 CMake 配置
project(sysinfoTests)

# 设置 C/C++ 标准(跨平台统一标准,可选C++11/C++14/C++17)
set(CMAKE_C_STANDARD 11)
set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON) # 强制使用指定的C++标准
set(CMAKE_CXX_EXTENSIONS OFF)       # 禁用编译器特有扩展,提升跨平台兼容性

## 创建测试可执行文件(名称自定义,此处为 sysinfoTests)
# 添加测试源文件
add_executable(sysinfoTests
    # 测试头文件列表

    # 测试源文件列表
    test_main.cpp
)

## 链接库 #将在可执行文件目标中链接库
target_link_libraries(sysinfoTests PRIVATE MTSysinfo) # 链接 mydll.lib

# 添加头文件路径
target_include_directories(sysinfoTests PRIVATE  ${CMAKE_SOURCE_DIR}/MTSysinfo/include )

## 设置测试输出目录
#set_target_properties(sysinfoTests PROPERTIES
#    RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/tests
#)
if(BUILD_TESTS) 
    # 添加测试
    enable_testing()
    add_test(NAME sysinfo_test COMMAND sysinfo_test)
endif()

至此,项目结构与关键文件均完成。用VS2019打开即可。

五、VS2019 构建跨平台项目(windows10 与 linux)

打开 VS2019 ---> 继续但无需代码--->文件--->打开--->CMake,选择项目根目录下的 CMakeLists.txt 文件,打开后,会开始构建项目。

后面就跟用windows10的linux子系统在visual studio2019中用C语言开发linux项目-CSDN博客

里的步骤一样了。

六、面向适用于 Linux 的 Windows 子系统

如果以适用于 Linux 的 Windows 子系统 (WSL) 为目标,则无需添加远程连接。

若要以 WSL 为目标,请选择主工具栏配置下拉列表中的"管理配置":

此时将显示"CMakeSettings.json"窗口。

按"添加配置"(绿色的 "+" 按钮),然后选择"Linux-GCC-Debug"或(如果使用 GCC)"Linux-GCC-Release"。 如果使用 Clang/LLVM 工具集,则选择 Clang 变体。 按"选择",然后按 Ctrl+S 以保存配置。

Visual Studio 2019 版本 16.1 以 WSL 为目标时,Visual Studio 不需要复制源文件和维护生成树的两个同步副本,因为 Linux 上的编译器可以直接访问已装入的 Windows 文件系统中的源文件。

在 Visual Studio 中配置 Linux CMake 项目 | Microsoft Learn

在 Visual Studio 中配置 CMake 调试会话 | Microsoft Learn

相关推荐
早川9192 小时前
Linux系统
linux·运维·服务器
汉克老师2 小时前
GESP2025年12月认证C++二级真题与解析(编程题1 (环保能量球))
c++·gesp二级·gesp2级
郝学胜-神的一滴3 小时前
Linux进程与线程控制原语对比:双刃出鞘,各显锋芒
linux·服务器·开发语言·数据结构·c++·程序人生
山上三树3 小时前
进程状态详解
linux·运维·服务器
青岛少儿编程-王老师3 小时前
CCF编程能力等级认证GESP—C++2级—20251227
java·开发语言·c++
oMcLin3 小时前
如何打造Linux运维监控平台:Prometheus + Grafana实战与性能优化
linux·运维·prometheus
javachen__3 小时前
341-十道经典程序设计题目
数据结构·c++·算法
wregjru3 小时前
【C++】2.6 红黑树及其实现(附代码)
开发语言·c++
木卫二号Coding3 小时前
jupyterlab-安装与启动
linux·运维·服务器