跨平台的编码
目录
- 需要区分不同平台的场景
- 工程组织文件
- 方法1:
- 方法2:
- 源文件
- 系统相关常用变量
- target_compile_definitions
需要区分不同平台的场景
- 链接第三方库的时候
- 难免存在不能跨平台的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
系统相关常用变量
- CMAKE_MAJOR_VERSION,CMAKE 主版本号,比如 2.4.6 中的 2
- CMAKE_MINOR_VERSION,CMAKE 次版本号,比如 2.4.6 中的 4
- CMAKE_PATCH_VERSION,CMAKE 补丁等级,比如 2.4.6 中的 6
- CMAKE_SYSTEM,系统名称,比如 Linux-2.6.22
- CMAKE_SYSTEM_NAME,不包含版本的系统名,比如 Linux
- CMAKE_SYSTEM_VERSION,系统版本,比如 2.6.22
- CMAKE_SYSTEM_PROCESSOR,处理器名称,比如 i686.
- UNIX,在所有的类 UNIX 平台为 TRUE,包括 OS X 和 cygwin
- WIN32,在所有的 win32 平台为 TRUE,包括 cygwin
target_compile_definitions
-
为目标添加编译定义。
target_compile_definitions(
[items1...] [ [items2...] ...]) -
命名的
必须由诸如 add_executable() 或 add_library() 之类的命令创建,并且不能为ALIAS target。 -
需要 INTERFACE , PUBLIC 和 PRIVATE 关键字来指定以下参数的范围。 PRIVATE 和 PUBLIC 项目将填充
的 COMPILE_DEFINITIONS 属性。 PUBLIC 和 INTERFACE 项目将填充 的 INTERFACE_COMPILE_DEFINITIONS 属性。