如何在Windows与Linux环境下构建可跨平台运行的C++库
跨平台C++项目构建方案
最优方案:使用CMake做构建配置
你想要的保留现有项目结构、新增build/linux、build/win子目录存放对应构建文件的需求,用CMake可以完美实现,不需要手动维护多套构建脚本,还能同时兼容GCC、MinGW、MSVC三大编译器,是目前C++跨平台项目的主流选择。
第一步:调整项目结构
你只需要在项目根目录新增CMakeLists.txt配置文件,以及你要求的build子目录即可,原有项目代码、目录结构完全不用改:
项目根目录 ├── src/ │ └── main.cpp ├── include/ │ ├── Inputs.h │ ├── GenerateTabValues.h │ └── Prototypes.h ├── data/ │ ├── TabNodes.csv │ └── TabWeights.csv ├── output/ │ ├── test1/ │ ├── test2/ │ └── test3/ ├── build/ │ ├── linux/ # Linux构建产物、Makefile存放目录 │ └── win/ # Windows构建产物、工程文件存放目录 └── CMakeLists.txt
第二步:编写CMakeLists.txt示例
下面的配置完全对应你原有Makefile的功能,支持test1/test2/test3/clean等目标,自动处理依赖查找:
cmake_minimum_required(VERSION 3.16) project(your_lib_name CXX) # 基础编译参数 set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -g -Wall") if(MSVC) add_compile_options(/W3) # MSVC专用编译参数 endif() # 查找依赖库 find_library(GSL_LIB gsl REQUIRED) find_library(GSL_CBLAS_LIB gslcblas REQUIRED) find_library(GMP_LIB gmp REQUIRED) find_library(QUADMATH_LIB quadmath REQUIRED) set(ALL_LIBS m ${GSL_LIB} ${GSL_CBLAS_LIB} ${GMP_LIB} ${QUADMATH_LIB}) # 头文件目录 include_directories(include) # 生成主程序 add_executable(main src/main.cpp) target_link_libraries(main PRIVATE ${ALL_LIBS}) # 定义test目标 add_custom_target(test1 COMMAND main test1 WORKING_DIRECTORY ${PROJECT_SOURCE_DIR}/output/test1 DEPENDS main ) add_custom_target(test2 COMMAND main test2 WORKING_DIRECTORY ${PROJECT_SOURCE_DIR}/output/test2 DEPENDS main ) add_custom_target(test3 COMMAND main test3 WORKING_DIRECTORY ${PROJECT_SOURCE_DIR}/output/test3 DEPENDS main ) add_custom_target(all DEPENDS test1 test2 test3)
第三步:各平台构建步骤
Linux端构建
和你原来的使用习惯完全一致:
cd build/linux cmake ../.. -DCMAKE_BUILD_TYPE=Debug make # 或者 make test1 直接编译运行test1
build/linux目录下会生成你熟悉的Makefile和main可执行文件。
Windows端构建
你可以按需选择MinGW或者MSVC工具链:
- MinGW方式(和Linux操作逻辑完全一致)
Windows下MinGW环境自带的mingw32-make就是GNU Make的等效工具,完全兼容Makefile语法:
cd build\win cmake ../.. -G "MinGW Makefiles" mingw32-make # 或者 mingw32-make test1
- MSVC方式(原生Visual Studio工程)
如果需要生成Visual Studio工程给MSVC编译:
cd build\win cmake ../.. -G "Visual Studio 17 2022" -A x64
直接双击生成的sln工程文件即可用VS打开编译,也可以用cmake --build . --config Debug命令行编译。
常见问题解答
- Windows有没有make的等效工具?
有两类:MinGW环境提供的mingw32-make完全兼容GNU Make语法,MSVC编译器套件提供的nmake功能类似但语法有差异。不建议手写两套Makefile适配,维护成本很高。 - 需要同时用MSVC和MinGW吗?
看你的需求:如果你的依赖库(GSL、GMP等)有MSVC编译版本,或者你需要给Windows原生环境提供二进制包,可以支持MSVC;如果只是自己用,MinGW足够,和Linux下的开发体验几乎没有差异。CMake会自动处理两种工具链的参数差异,你不需要改配置。
可移植性优化建议
- 代码中不要硬编码路径分隔符,用C++17的
std::filesystem库处理路径,或者用宏判断平台区分/和\。 - 不要使用Linux特有API,如果必须使用系统调用,用宏包裹做平台适配。
- 依赖库尽量选择官方提供跨平台支持的版本,你目前用的GSL、GMP等都有成熟的Windows移植版。
内容的提问来源于stack exchange,提问作者Davide Papapicco
相关产品推荐
相关产品推荐

