CMake是一个强大的跨平台构建系统生成器,可以简化在不同操作系统上的构建过程。以下是在Linux上配置CMake以实现跨平台构建的详细方法:
cmake_minimum_required(VERSION 3.10)
project(MyCrossPlatformProject)
# 设置C++标准
set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
# 添加可执行文件
add_executable(myapp main.cpp)
cmake_minimum_required(VERSION 3.12)
project(MyCrossPlatformProject
VERSION 1.0
LANGUAGES CXX)
# 设置输出目录
set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/lib)
set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/lib)
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin)
# 跨平台编译选项
if(MSVC)
add_compile_options(/W4 /WX)
else()
add_compile_options(-Wall -Wextra -pedantic -Werror)
endif()
# 添加可执行文件
add_executable(myapp main.cpp)
if(UNIX AND NOT APPLE)
message(STATUS "Building on Linux")
# Linux特定设置
add_definitions(-DLINUX)
elseif(APPLE)
message(STATUS "Building on macOS")
# macOS特定设置
add_definitions(-DMACOS)
elseif(WIN32)
message(STATUS "Building on Windows")
# Windows特定设置
add_definitions(-DWINDOWS)
endif()
# 根据平台添加不同的源文件
if(WIN32)
set(PLATFORM_SRCS win32_impl.cpp)
else()
set(PLATFORM_SRCS unix_impl.cpp)
endif()
add_executable(myapp main.cpp ${PLATFORM_SRCS})
# 查找OpenSSL
find_package(OpenSSL REQUIRED)
if(OPENSSL_FOUND)
include_directories(${OPENSSL_INCLUDE_DIR})
target_link_libraries(myapp ${OPENSSL_LIBRARIES})
endif()
# 查找线程库 (跨平台)
find_package(Threads REQUIRED)
target_link_libraries(myapp Threads::Threads)
include(FetchContent)
FetchContent_Declare(
json
GIT_REPOSITORY https://github.com/nlohmann/json.git
GIT_TAG v3.9.1
)
FetchContent_MakeAvailable(json)
target_link_libraries(myapp PRIVATE nlohmann_json::nlohmann_json)
创建 toolchain.cmake
文件:
set(CMAKE_SYSTEM_NAME Linux)
set(CMAKE_SYSTEM_PROCESSOR arm)
# 指定交叉编译器路径
set(CMAKE_C_COMPILER /path/to/arm-linux-gnueabihf-gcc)
set(CMAKE_CXX_COMPILER /path/to/arm-linux-gnueabihf-g++)
# 指定目标环境根目录
set(CMAKE_FIND_ROOT_PATH /path/to/sysroot)
# 只在sysroot中搜索库和头文件
set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)
set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)
set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)
set(CMAKE_FIND_ROOT_PATH_MODE_PACKAGE ONLY)
使用工具链文件构建:
cmake -DCMAKE_TOOLCHAIN_FILE=toolchain.cmake ..
# 在CMake中定义平台宏
if(WIN32)
add_definitions(-DPLATFORM_WINDOWS)
elseif(APPLE)
add_definitions(-DPLATFORM_MACOS)
else()
add_definitions(-DPLATFORM_LINUX)
endif()
然后在代码中使用:
#if defined(PLATFORM_WINDOWS)
// Windows特定代码
#elif defined(PLATFORM_MACOS)
// macOS特定代码
#elif defined(PLATFORM_LINUX)
// Linux特定代码
#endif
# 安装可执行文件
install(TARGETS myapp
RUNTIME DESTINATION bin
LIBRARY DESTINATION lib
ARCHIVE DESTINATION lib
)
# 安装头文件
install(DIRECTORY include/ DESTINATION include)
# 平台特定的安装规则
if(WIN32)
install(FILES myapp.ini DESTINATION .)
else()
install(FILES myapp.conf DESTINATION etc)
endif()
# 创建构建目录并配置
mkdir build
cd build
cmake ..
# 构建项目
cmake --build .
# 指定生成器(如Ninja)
cmake -G Ninja ..
# 指定构建类型(Debug/Release)
cmake -DCMAKE_BUILD_TYPE=Release ..
# 启用测试
enable_testing()
# 添加测试
add_test(NAME mytest COMMAND myapp --test)
# 使用CTest
find_package(CTest)
if(CTEST_FOUND)
add_subdirectory(tests)
endif()
FindPackage
和FetchContent
管理依赖通过以上配置,您可以在Linux上创建能够在多个平台上构建和运行的CMake项目。