尧图建网站 尧图建网站 YAOTU WEB BUILD 免费咨询
ARTICLE DETAIL

资讯详情

深耕网站建设与建站编程的一线实战洞察。

C++跨平台开发实战:工具链配置与核心技巧

C++跨平台开发实战:工具链配置与核心技巧 1. 跨平台开发的必要性解析在桌面应用、嵌入式系统和游戏开发领域跨平台能力已成为C项目的标配需求。我经历过一个典型的案例某工业控制软件最初仅支持Windows平台当客户要求在Linux系统部署时团队不得不花费三个月进行移植。这促使我系统研究了跨平台开发的技术体系。跨平台开发的核心矛盾在于不同操作系统对文件路径、线程管理、网络通信等基础功能的实现存在差异。例如Windows使用反斜杠路径分隔符而Unix系采用正斜杠Windows线程API是CreateThreadPOSIX标准则是pthread_create。2. 工具链配置方案2.1 编译器选择策略ClangLLVM已成为跨平台开发的首选工具链其优势在于统一的代码生成前端Clang支持所有主流平台更严格的C标准兼容性检查模块化设计便于定制工具链对于Windows平台推荐使用MSVC与Clang-cl的混合方案。实测表明Clang-cl编译速度比纯MSVC快30%同时保持二进制兼容性。典型的环境变量配置如下# Windows平台示例 set CCclang-cl set CXXclang-cl set CFLAGS-fms-compatibility-version19.20 -Wno-microsoft-cast2.2 构建系统选型对比CMake是目前最成熟的跨平台构建方案。其核心优势在于支持生成各平台的本地工程文件VS解决方案/Xcode项目/Makefile完善的依赖管理机制模块化的脚本设计以下是一个支持多平台的CMakeLists.txt模板cmake_minimum_required(VERSION 3.20) project(CrossPlatformDemo) set(CMAKE_CXX_STANDARD 17) set(CMAKE_CXX_STANDARD_REQUIRED ON) if(WIN32) add_definitions(-DWIN32_LEAN_AND_MEAN) elseif(UNIX) find_package(Threads REQUIRED) endif() add_executable(demo main.cpp)3. 平台抽象层设计3.1 文件系统封装建议采用C17的 标准库作为基础对仍在使用旧标准的项目可使用boost.filesystem。关键封装点包括路径规范化处理文件权限管理特殊文件操作符号链接等典型实现示例namespace fs { #ifdef _WIN32 constexpr char path_sep \\; #else constexpr char path_sep /; #endif std::string normalize_path(const std::string raw) { std::filesystem::path p(raw); return p.make_preferred().string(); } }3.2 线程与同步原语推荐使用标准库 和 作为基础封装。对于需要更高性能的场景可考虑以下优化策略线程池实现应区分平台特性Windows优先使用IOCP完成端口Linux采用epoll事件机制macOS利用GCD调度队列原子操作封装示例class SpinLock { std::atomic_flag flag ATOMIC_FLAG_INIT; public: void lock() { while(flag.test_and_set(std::memory_order_acquire)); } void unlock() { flag.clear(std::memory_order_release); } };4. 图形界面跨平台方案4.1 Qt框架深度优化Qt仍是C跨平台GUI的首选方案。在实际项目中我们总结出这些优化技巧样式表性能优化// 错误用法 - 每次设置都会触发重绘 widget-setStyleSheet(color: red;); widget-setStyleSheet(widget-styleSheet() font-size: 12px;); // 正确用法 - 合并样式设置 widget-setStyleSheet(color: red; font-size: 12px;);信号槽连接优化// 传统连接方式运行时检查 connect(sender, SIGNAL(valueChanged(int)), receiver, SLOT(updateValue(int))); // 新式连接编译期检查 connect(sender, Sender::valueChanged, receiver, Receiver::updateValue);4.2 轻量级替代方案对于不需要完整Qt生态的项目可考虑Dear ImGui 后端适配支持OpenGL/Vulkan/Metal/DirectX单头文件设计集成成本低适合工具类应用开发Sciter引擎HTML/CSS作为界面描述语言小于5MB的运行时体积商业项目需购买授权5. 调试与性能分析5.1 跨平台调试技巧核心转储分析# Linux生成core dump ulimit -c unlimited ./program # Windows生成dump procdump -ma -e program.exe条件断点设置// GDB/LLDB语法 break filename.cpp:123 if iteration5 // Windbg语法 bp source.cpp:143 j (dwo(ebp8)5) gc;g5.2 性能分析工具链推荐使用以下平台专用工具的组合方案平台CPU分析内存分析GPU分析WindowsVTuneDrMemoryPIXLinuxperfValgrind MassifNsightmacOSInstrumentsLeaksMetal System Trace典型使用示例# Linux perf基础分析 perf record -g ./program perf report -n --stdio6. 持续集成实践6.1 多平台构建矩阵GitHub Actions的典型配置示例jobs: build: strategy: matrix: os: [ubuntu-latest, windows-latest, macos-latest] compiler: [gcc, clang, msvc] steps: - uses: actions/checkoutv3 - name: Configure run: cmake -B build -DCMAKE_CXX_COMPILER${{matrix.compiler}} - name: Build run: cmake --build build --config Release6.2 自动化测试要点平台特性测试应包含文件系统大小写敏感性测试路径编码转换验证线程优先级行为检查典型测试用例结构TEST(PlatformTest, PathNormalization) { #ifdef _WIN32 EXPECT_EQ(normalize_path(C:/test\\sub), C:\\test\\sub); #else EXPECT_EQ(normalize_path(/tmp\\file), /tmp/file); #endif }7. 依赖管理策略7.1 第三方库集成方案推荐采用vcpkg作为跨平台包管理器其优势在于支持超过2000个开源库自动处理依赖关系与CMake深度集成典型使用流程vcpkg install fmt:x64-windows vcpkg install glfw3 --tripletx64-linux7.2 源码依赖管理对于需要定制的依赖项可采用CMake的FetchContent模块include(FetchContent) FetchContent_Declare( catch2 GIT_REPOSITORY https://github.com/catchorg/Catch2.git GIT_TAG v3.3.2 ) FetchContent_MakeAvailable(catch2)8. 安装包制作方案8.1 Windows平台方案WiX工具集制作MSI安装包Component IdMainExecutable Guid* File Source$(var.BinPath)\app.exe KeyPathyes/ /Component高级功能实现自动VC运行时依赖安装服务程序注册注册表项配置8.2 Linux/macOS方案Debian包规范示例dh_make --native -s -p myapp_1.0 debuild -us -ucmacOS应用打包技巧# 创建标准应用束 mkdir -p MyApp.app/Contents/MacOS cp myapp MyApp.app/Contents/MacOS/ install_name_tool -change rpath/lib.dylib executable_path/../Frameworks/lib.dylib MyApp.app/Contents/MacOS/myapp9. 移动端扩展方案9.1 Android NDK开发关键配置要点CMake工具链文件指定set(CMAKE_TOOLCHAIN_FILE ${ANDROID_NDK}/build/cmake/android.toolchain.cmake)ABI过滤策略android { defaultConfig { ndk { abiFilters armeabi-v7a, arm64-v8a } } }9.2 iOS/macOS通用二进制多架构编译设置# 生成通用二进制 xcrun -sdk macosx clang -arch x86_64 -arch arm64 -o universal_app source.cppFramework打包规范add_library(MyFramework SHARED src.cpp) set_target_properties(MyFramework PROPERTIES FRAMEWORK TRUE MACOSX_FRAMEWORK_IDENTIFIER com.example.MyFramework )10. 性能优化专项10.1 SIMD指令优化跨平台SIMD实现方案#if defined(__AVX2__) #include immintrin.h #elif defined(__ARM_NEON) #include arm_neon.h #endif void simd_add(float* a, float* b, float* c, size_t n) { #ifdef __AVX2__ for(size_t i0; in; i8) { __m256 va _mm256_load_ps(ai); __m256 vb _mm256_load_ps(bi); _mm256_store_ps(ci, _mm256_add_ps(va, vb)); } #elif __ARM_NEON for(size_t i0; in; i4) { float32x4_t va vld1q_f32(ai); float32x4_t vb vld1q_f32(bi); vst1q_f32(ci, vaddq_f32(va, vb)); } #endif }10.2 内存访问优化跨平台缓存友好设计结构体布局优化原则将频繁访问的字段集中放置保持对齐到缓存行大小通常64字节使用[[gnu::packed]]控制填充内存分配策略// 跨平台对齐分配 void* aligned_alloc(size_t align, size_t size) { #ifdef _WIN32 return _aligned_malloc(size, align); #else return ::aligned_alloc(align, size); #endif }11. 安全加固措施11.1 内存安全防护智能指针跨平台用法// 统一使用C14的make_unique auto ptr std::make_uniqueMyClass(); // 共享内存的特殊处理 struct SharedData { std::atomicint counter; // 其他数据成员... }; auto region std::make_uniqueSharedData();边界检查惯用法templatetypename T, size_t N class SafeArray { T data[N]; public: T operator[](size_t idx) { if(idx N) throw std::out_of_range(Index invalid); return data[idx]; } };11.2 加密方案选择推荐使用以下跨平台加密库OpenSSL功能全面但API复杂libsodium现代API设计更易用BotanC原生实现接口友好典型AES加密示例#include botan/auto_rng.h #include botan/cipher_mode.h std::vectoruint8_t encrypt_aes(std::string_view plaintext) { Botan::AutoSeeded_RNG rng; auto key rng.random_vec(32); // 256-bit key auto iv rng.random_vec(16); auto enc Botan::Cipher_Mode::create(AES-256/CBC/PKCS7, Botan::ENCRYPTION); enc-set_key(key); enc-start(iv); std::vectoruint8_t pt(plaintext.begin(), plaintext.end()); enc-finish(pt); return pt; }12. 项目结构设计规范12.1 目录布局方案推荐采用以下跨平台项目结构project_root/ ├── cmake/ # CMake脚本 ├── include/ # 公共头文件 ├── src/ # 实现代码 │ ├── platform/ # 平台相关代码 │ │ ├── windows/ │ │ ├── linux/ │ │ └── macos/ ├── third_party/ # 第三方依赖 ├── tests/ # 单元测试 └── tools/ # 构建工具12.2 符号导出控制跨平台动态库导出规范// 公共头文件platform_api.h #ifdef _WIN32 #ifdef BUILDING_DLL #define API __declspec(dllexport) #else #define API __declspec(dllimport) #endif #else #define API __attribute__((visibility(default))) #endif class API MyExportedClass { // 类定义... };13. 异常处理策略13.1 错误码设计原则跨平台错误码系统实现enum class ErrorCode { Success 0, FileNotFound, PermissionDenied, NetworkError, // 其他错误码... }; class Error { ErrorCode code; std::string message; std::source_location location; public: Error(ErrorCode c, std::string msg, std::source_location loc std::source_location::current()) : code(c), message(std::move(msg)), location(loc) {} std::string format() const { return std::format({} at {}:{}, message, location.file_name(), location.line()); } };13.2 异常安全保证跨平台资源管理模式class FileHandle { #ifdef _WIN32 HANDLE hFile INVALID_HANDLE_VALUE; #else int fd -1; #endif public: explicit FileHandle(const char* filename) { #ifdef _WIN32 hFile CreateFileA(filename, ...); if(hFile INVALID_HANDLE_VALUE) throw_last_error(); #else fd open(filename, O_RDONLY); if(fd -1) throw std::system_error(errno, std::system_category()); #endif } ~FileHandle() { #ifdef _WIN32 if(hFile ! INVALID_HANDLE_VALUE) CloseHandle(hFile); #else if(fd ! -1) close(fd); #endif } };14. 国际化与本地化14.1 多语言实现方案推荐使用ICU库处理复杂文本#include unicode/unistr.h #include unicode/ustream.h void process_unicode(const std::string utf8str) { icu::UnicodeString ustr icu::UnicodeString::fromUTF8(utf8str); std::cout Length in code points: ustr.countChar32() \n; // 阿拉伯语等双向文本处理 UErrorCode status U_ZERO_ERROR; icu::BiDi bidi; bidi.setPara(ustr, UBIDI_DEFAULT_LTR, nullptr, status); }14.2 本地化资源管理使用gettext的标准流程代码中标记可翻译字符串#include libintl.h #define _(str) gettext(str) std::cout _(Welcome message);提取字符串生成PO文件xgettext -d myapp -o myapp.pot *.cpp编译MO文件msgfmt -o zh_CN/LC_MESSAGES/myapp.mo myapp_zh_CN.po15. 扩展性与插件架构15.1 动态加载方案跨平台插件加载实现class PluginLoader { #ifdef _WIN32 HMODULE handle nullptr; #else void* handle nullptr; #endif public: explicit PluginLoader(const std::string path) { #ifdef _WIN32 handle LoadLibraryA(path.c_str()); #else handle dlopen(path.c_str(), RTLD_LAZY); #endif if(!handle) throw std::runtime_error(Load failed); } templatetypename T T* resolve(const std::string name) { #ifdef _WIN32 auto sym GetProcAddress(handle, name.c_str()); #else auto sym dlsym(handle, name.c_str()); #endif return reinterpret_castT*(sym); } };15.2 接口设计规范推荐采用纯虚接口工厂模式的插件架构// 公共接口定义 class IPlugin { public: virtual ~IPlugin() default; virtual std::string name() const 0; virtual void execute() 0; }; // 插件导出函数约定 extern C { IPlugin* create_plugin(); void destroy_plugin(IPlugin*); }16. 网络通信实现16.1 跨平台Socket封装基于ASIO的通用网络层namespace net boost::asio; using tcp net::ip::tcp; class SocketWrapper { net::io_context io; tcp::socket sock{io}; public: void connect(const std::string host, uint16_t port) { tcp::resolver resolver(io); auto endpoints resolver.resolve(host, std::to_string(port)); net::connect(sock, endpoints); } std::string read(size_t len) { std::vectorchar buf(len); net::read(sock, net::buffer(buf)); return {buf.begin(), buf.end()}; } };16.2 协议设计建议跨平台通信协议要点字节序处理templatetypename T T htonT(T value) { static_assert(std::is_integral_vT, Integer required); if constexpr(sizeof(T) 2) { return htons(value); } else if constexpr(sizeof(T) 4) { return htonl(value); } else if constexpr(sizeof(T) 8) { return htobe64(value); } }消息帧设计struct MessageHeader { uint32_t magic; // 协议标识 0xA1B2C3D4 uint32_t length; // 数据部分长度 uint16_t version; // 协议版本 uint16_t checksum; // 头部校验和 };17. 进程间通信方案17.1 共享内存实现跨平台共享内存封装class SharedMemory { #ifdef _WIN32 HANDLE hMap nullptr; #else int fd -1; #endif void* addr nullptr; public: SharedMemory(const char* name, size_t size) { #ifdef _WIN32 hMap CreateFileMappingA(INVALID_HANDLE_VALUE, nullptr, PAGE_READWRITE, 0, size, name); addr MapViewOfFile(hMap, FILE_MAP_ALL_ACCESS, 0, 0, size); #else fd shm_open(name, O_CREAT | O_RDWR, 0666); ftruncate(fd, size); addr mmap(nullptr, size, PROT_READ|PROT_WRITE, MAP_SHARED, fd, 0); #endif } ~SharedMemory() { #ifdef _WIN32 UnmapViewOfFile(addr); CloseHandle(hMap); #else munmap(addr, size); close(fd); #endif } };17.2 消息队列选型推荐方案对比POSIX消息队列Linux/macOS优点内核级实现高性能缺点Windows不支持Boost.Interprocess消息队列优点完全跨平台缺点用户态实现性能稍低第三方解决方案如ZeroMQ优点丰富的通信模式缺点引入额外依赖18. 硬件交互层设计18.1 串口通信封装跨平台串口实现class SerialPort { #ifdef _WIN32 HANDLE hPort INVALID_HANDLE_VALUE; #else int fd -1; #endif public: bool open(const std::string port, int baud) { #ifdef _WIN32 hPort CreateFileA(port.c_str(), ...); DCB params {0}; params.BaudRate baud; SetCommState(hPort, params); #else fd ::open(port.c_str(), O_RDWR | O_NOCTTY); termios options{}; cfsetispeed(options, baud); tcsetattr(fd, TCSANOW, options); #endif } size_t write(const void* data, size_t len) { #ifdef _WIN32 DWORD written; WriteFile(hPort, data, len, written, nullptr); return written; #else return ::write(fd, data, len); #endif } };18.2 传感器数据采集平台抽象层设计模式class SensorInterface { public: virtual ~SensorInterface() default; virtual double read_temperature() 0; virtual double read_humidity() 0; }; // Windows实现 class WinSensor : public SensorInterface { // 使用Windows特定API实现 }; // Linux实现 class LinuxSensor : public SensorInterface { // 通过sysfs或设备文件实现 };19. 测试驱动开发实践19.1 单元测试框架选择推荐Catch2作为跨平台测试框架其优势在于单头文件设计易于集成支持BDD风格测试丰富的断言宏典型测试示例TEST_CASE(Vector operations, [container]) { std::vectorint v{1,2,3}; SECTION(push_back increases size) { v.push_back(4); REQUIRE(v.size() 4); } SECTION(clear empties the vector) { v.clear(); REQUIRE(v.empty()); } }19.2 模拟测试技术平台相关行为的模拟策略文件系统模拟class MockFileSystem : public IFileSystem { std::mapstd::string, std::string fakeFiles; public: bool read(const std::string path, std::string out) override { if(fakeFiles.count(path)) { out fakeFiles[path]; return true; } return false; } };网络模拟using namespace testing; class MockNetwork : public INetwork { public: MOCK_METHOD(bool, connect, (const std::string host), (override)); MOCK_METHOD(std::string, sendRequest, (const std::string), (override)); }; TEST(NetworkTest, ConnectionTest) { MockNetwork net; EXPECT_CALL(net, connect(example.com)) .WillOnce(Return(true)); Client client(net); ASSERT_TRUE(client.connect()); }20. 性能关键代码优化20.1 内存池设计跨平台内存池实现要点class MemoryPool { struct Block { Block* next; }; Block* freeList nullptr; size_t blockSize; public: explicit MemoryPool(size_t size) : blockSize(size) {} void* allocate() { if(!freeList) { // 平台特定的对齐分配 #ifdef _WIN32 auto mem _aligned_malloc(blockSize, alignof(Block)); #else auto mem aligned_alloc(alignof(Block), blockSize); #endif return mem; } auto ptr freeList; freeList freeList-next; return ptr; } void deallocate(void* ptr) { auto block static_castBlock*(ptr); block-next freeList; freeList block; } };20.2 无锁数据结构跨平台原子操作封装templatetypename T class LockFreeQueue { struct Node { T data; std::atomicNode* next; }; std::atomicNode* head; std::atomicNode* tail; public: void push(const T value) { Node* newNode new Node{value, nullptr}; Node* oldTail tail.exchange(newNode, std::memory_order_acq_rel); oldTail-next.store(newNode, std::memory_order_release); } bool pop(T out) { Node* oldHead head.load(std::memory_order_acquire); if(!oldHead-next) return false; out oldHead-next.load(std::memory_order_relaxed)-data; head.store(oldHead-next, std::memory_order_release); delete oldHead; return true; } };21. 代码生成与元编程21.1 模板元编程应用跨平台类型特征检测templatetypename T auto serialize_impl(T t, int) - decltype(t.serialize(), std::true_type{}) { return {}; } templatetypename T std::false_type serialize_impl(T, ...) { return {}; } templatetypename T constexpr bool has_serialize decltype(serialize_impl(std::declvalT(), 0))::value; templatetypename T void serialize(T t) { if constexpr(has_serializeT) { t.serialize(); } else { static_assert(has_serializeT, Type must have serialize method); } }21.2 反射模拟技术跨平台反射方案比较代码生成方案如Qt moc优点运行时开销小缺点需要预处理步骤模板元编程方案优点纯C实现缺点编译时间长第三方库如RTTR优点功能完整缺点增加依赖22. 嵌入式交叉编译22.1 工具链配置典型交叉编译环境搭建# ARM Cortex-M工具链示例 set(CMAKE_SYSTEM_NAME Generic) set(CMAKE_SYSTEM_PROCESSOR arm) set(CMAKE_C_COMPILER arm-none-eabi-gcc) set(CMAKE_CXX_COMPILER arm-none-eabi-g) set(CMAKE_TRY_COMPILE_TARGET_TYPE STATIC_LIBRARY)22.2 资源受限优化嵌入式开发特殊考量内存占用分析工具arm-none-eabi-sizeLinker map文件分析关键优化技术// 使用自定义内存分配器 templatetypename T class PoolAllocator { static MemoryPool pool; public: T* allocate(size_t n) { return static_castT*(pool.allocate(n * sizeof(T))); } }; // 将对象放入特定内存段 __attribute__((section(.fast_mem))) volatile uint32_t* const reg reinterpret_castuint32_t*(0x40000000);23. 云原生集成方案23.1 Docker容器化跨平台镜像构建策略# 多阶段构建示例 FROM ubuntu:20.04 AS builder RUN apt-get update apt-get install -y g cmake COPY . /src WORKDIR /build RUN cmake /src make FROM alpine:latest COPY --frombuilder /build/app /usr/local/bin CMD [app]23.2 Kubernetes部署C服务部署要点资源限制配置resources: limits: cpu: 2 memory: 1Gi requests: cpu: 500m memory: 512Mi健康检查配置livenessProbe: exec: command: [/healthcheck] initialDelaySeconds: 5 periodSeconds: 1024. 机器学习集成24.1 模型推理优化跨平台推理引擎选择ONNX Runtime支持多后端CPU/GPU/DSP跨平台一致性高TensorFlow Lite移动端优化好支持硬件加速典型集成示例Ort::Env env; Ort::SessionOptions options; options.SetIntraOpNumThreads(4); Ort::Session session(env, model.onnx, options); std::vectorfloat input get_input_data(); auto input_tensor Ort::Value::CreateTensorfloat( Ort::MemoryInfo::CreateCpu(OrtDeviceAllocator, OrtMemTypeDefault), input.data(), input.size(), input_shape, 3); auto outputs session.Run(Ort::RunOptions{nullptr}, input_names, input_tensor, 1, output_names, 1);24.2 特征工程实现跨平台数值计算优化void normalize_features(std::spanfloat data) { #if defined(__AVX512F__) const __m512 mean _mm512_set1_ps(calculate_mean(data)); const __m512 scale _mm512_set1_ps(calculate_stddev(data)); for(size_t i0; idata.size(); i16) { __m512 vec _mm512_loadu_ps(data.data()i); vec _mm512_sub_ps(vec, mean); vec _mm512_div_ps(vec, scale); _mm512_storeu_ps(data.data()i, vec); } #else // 通用实现... #endif }25. 实时系统开发25.1 确定性延迟保障实时系统开发要点优先级设置#ifdef __linux__ sched_param param{}; param.sched_priority sched_get_priority_max(SCHED_FIFO); pthread_setschedparam(pthread_self(), SCHED_FIFO, param); #endif内存锁定mlockall(MCL_CURRENT | MCL_FUTURE); // Linux VirtualLock(ptr, size); // Windows25.2 硬件定时器使用跨平台定时方案class HighResTimer { #ifdef _WIN32 LARGE_INTEGER freq; LARGE_INTEGER start; #else timespec start{}; #endif public: HighResTimer() { #ifdef _WIN32 QueryPerformanceFrequency(freq); QueryPerformanceCounter(start); #else clock_gettime(CLOCK_MONOTONIC, start); #endif } double elapsed() const { #ifdef _WIN32 LARGE_INTEGER now; QueryPerformanceCounter(now); return (now.QuadPart - start.QuadPart) / double(freq.QuadPart); #else timespec now; clock_gettime(CLOCK_MONOTONIC, now); return (now.tv_sec - start.tv_sec) (now.tv_nsec - start.tv_nsec) / 1e9; #endif } };26. 代码质量保障26.1 静态分析集成跨平台分析工具链Clang-Tidy配置示例Checks: -*, clang-analyzer-*, modernize-*, performance-*, portability-* WarningsAsErrors: * HeaderFilterRegex: .*自动化扫描流程run-clang-tidy -p build -checksmodernize-*26.2 动态分析方案内存错误检测方案ValgrindLinux/macOSvalgrind --leak-checkfull ./programDrMemoryWindowsdrmemory -light -check_leaks -- program.exe27. 文档生成方案27.1 API文档自动化Doxygen配置要点PROJECT_NAME MyProject OUTPUT_DIRECTORY docs INPUT src include RECURSIVE YES GENERATE_LATEX NO GENERATE_HTML YES HAVE_DOT YES CALL_GRAPH YES CALLER_GRAPH YES27.2 架构图生成使用Graphviz的示例digraph module_deps { rankdirLR; node [shapebox]; core - {network, utils}; gui - core; cli - core; tests - {core, network}; }28. 遗留系统迁移28.1 兼容层设计Windows API模拟层示例#ifdef __linux__ // 模拟Windows线程API HANDLE CreateThread(LPSECURITY_ATTRIBUTES, SIZE_T, LPTHREAD_START_ROUTINE lpFunc, L
返回列表