在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
