跨平台的编码

需要区分不同平台的场景

  • 链接第三方库的时候
  • 难免存在不能跨平台的API。。。
  • 其他场景(待补充)

工程组织文件

方法1:

# 检测操作系统
if(CMAKE_SYSTEM_NAME STREQUAL "Linux")
    message(STATUS "Config Linux")
    target_compile_definitions(${mainname} PUBLIC "IS_LINUX")
elseif(CMAKE_SYSTEM_NAME STREQUAL "Windows")
    message(STATUS "Config Windows")
    target_compile_definitions(${mainname} PUBLIC "IS_WINDOWS")
elseif(CMAKE_SYSTEM_NAME STREQUAL "Darwin")
    message(STATUS "Config MacOS")
    target_compile_definitions(${mainname} PUBLIC "IS_MACOS")
else()
    message(STATUS "${CMAKE_SYSTEM_NAME}")
endif()

# -- Config Windows

方法2:

IF(WIN32)
	message(STATUS "Windows")
ELSEIF(UNIX)
	message(STATUS "Unix or like Unix")
ELSEIF(APPLE)
	message(STATUS "Apple")
ENDIF()

源文件

int data_get(){
#ifdef IS_WINDOWS
    return 1;
#elif IS_LINUX
    return 2;
#elif IS_MACOS
    return 3;
#else
    return 4;
#endif
}

int a = data_get();  // a == 1

系统相关常用变量

  1. CMAKE_MAJOR_VERSION,CMAKE 主版本号,比如 2.4.6 中的 2
  2. CMAKE_MINOR_VERSION,CMAKE 次版本号,比如 2.4.6 中的 4
  3. CMAKE_PATCH_VERSION,CMAKE 补丁等级,比如 2.4.6 中的 6
  4. CMAKE_SYSTEM,系统名称,比如 Linux-2.6.22
  5. CMAKE_SYSTEM_NAME,不包含版本的系统名,比如 Linux
  6. CMAKE_SYSTEM_VERSION,系统版本,比如 2.6.22
  7. CMAKE_SYSTEM_PROCESSOR,处理器名称,比如 i686.
  8. UNIX,在所有的类 UNIX 平台为 TRUE,包括 OS X 和 cygwin
  9. WIN32,在所有的 win32 平台为 TRUE,包括 cygwin

target_compile_definitions

  • 为目标添加编译定义。
    target_compile_definitions(<target> <INTERFACE|PUBLIC|PRIVATE> [items1...] [<INTERFACE|PUBLIC|PRIVATE> [items2...] ...])

  • 命名的 必须由诸如 add_executable() 或 add_library() 之类的命令创建,并且不能为ALIAS target。

  • 需要 INTERFACE , PUBLIC 和 PRIVATE 关键字来指定以下参数的范围。 PRIVATE 和 PUBLIC 项目将填充 的 COMPILE_DEFINITIONS 属性。 PUBLIC 和 INTERFACE 项目将填充 的 INTERFACE_COMPILE_DEFINITIONS 属性。

原文地址:https://www.cnblogs.com/faithlocus/p/15593439.html