最近又写了一些cmakelists 文件,对cmake使用更加顺手啦。
多项目时,总的CMakelists file following:
# CMAKE verison
cmake_minimum_required(VERSION 3.0.0)
# Project name
project(xxxgame)
### Created The Build Output Directory
set(build_output_directory ${CMAKE_BINARY_DIR}/bin/ CACHE INTERNAL "Build Output directory")
message("Build Output Directory : ${CMAKE_BINARY_DIR}")
file(MAKE_DIRECTORY ${build_output_directory})
file(MAKE_DIRECTORY ${build_output_directory}/mod)
file(MAKE_DIRECTORY ${build_output_directory}/xxxfig/xxxom)
message("Created The Build Output Directory Done(${build_output_directory}).")
### Copy xxxfigruation files
FILE(GLOB xxxfig_files ../xxxfig/*.* )
FILE(GLOB xxxfig_xxxom_files ../xxxfig/xxxom/*.* )
file(COPY ${xxxfig_files} DESTINATION ${build_output_directory}/xxxfig/)
file(COPY ${xxxfig_xxxom_files} DESTINATION ${build_output_directory}/xxxfig/xxxom/)
message("Copy xxxfigruation files to xxxfig directory Done(${build_output_directory}).")
### Baisc xxxfiguration
set(base_add_include ../../../ ../../xxx555 CACHE INTERNAL "Baisc addtion include directory")
message("base_add_include :${base_add_include}")
set(base_link_directory ../../../lib ${build_output_directory} CACHE INTERNAL "Baisc Link include directory")
message("base_link_directory :${base_link_directory}")
set(base_lib pthreadVC2.lib CACHE INTERNAL "Baisc addtion library")
set(exbase_lib ${base_lib} libxxxgame.lib CACHE INTERNAL "Extension Baisc addtion library")
set(ffmpeg_lib swscale.lib swresample.lib postproc.lib avdevice.lib avfilter.lib avformat.lib avcodec.lib avutil.lib CACHE INTERNAL "FFmpeg addtion library")
message("base_lib :${base_lib}")
message("exbase_lib :${exbase_lib}")
message("ffmpeg_lib :${ffmpeg_lib}")
### Preprocessor Define
set(base_preprocessor -DMERI CACHE INTERNAL "Baisc Preprocessor Define")
set(xxxgame_macros -Dxxxgame_LIB -Dxxxgame_xxxxxE -DUSE_xxxgame_WIN32_MACRO -D__STDC_CONSTANT_MACROS -DFF_API_OLD_AVIO=0 -DPIPELINE_FILTER)
###
# #define NTDDI_WINXP 0x05010000
# #define NTDDI_WIN7 0x06010000
# #define NTDDI_WIN8 0x06020000
# #define NTDDI_WIN10 0x0A000000
# #define HAVE_STRUCT_TIMESPEC // error: redefinition of 'struct timespec' in pthread.h or time.h, link:https://stackoverflow.com/questions/33557506/timespec-redefinition-error
# #define _WIN32_WINNT 0x0501 //Windows XP link:https://www.cnblogs.com/zhcncn/archive/2013/05/21/3091052.html
# #define _WIN32_WINNT 0x0602 //Windows 8
# #define _WIN32_WINNT 0x0601 //Windows 7
# #define _WIN32_WINNT 0x0501 //Windows XP
###
set(windows_macros -DWIN32 -D_WINDOWS -D_WIN32_WINNT=0x0501 -DNTDDI_VERSION=0x05010000 -DHAVE_STRUCT_TIMESPEC )
if(${CMAKE_BUILD_TYPE} STREQUAL Debug)
set(base_preprocessor ${xxxgame_macros} ${windows_macros} -DDEBUG CACHE INTERNAL "Baisc Preprocessor Define")
else()
set(base_preprocessor ${xxxgame_macros} ${windows_macros} -DRELEASE CACHE INTERNAL "Baisc Preprocessor Define")
endif()
### sets Character Set to Unicode or Multi Byte
SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /UMBCS /D_MBCS")
add_subdirectory(xxxxxe-asxxxxem)
add_subdirectory(xxxxxe-ctrl-sdl)
#add_subdirectory(server-webrtc)
add_subdirectory(xxxxxe-sexxx-webrtc-xxx)
add_subdirectory(xxxxxe-encoxxxo)
add_subdirectory(xxxxxe-encoxxxfx)
add_subdirectory(xxxxxe-encoxxxnx)
add_subdirectory(xxxxxe-encodxxeo)
add_subdirectory(xxxxxe-encxxx64)
add_subdirectory(xxxxxe-filxxxyuv)
add_subdirectory(xxxxxe-server-xxx555)
add_subdirectory(xxxxxe-vsxxxop)
add_subdirectory(xxxxxe-vsoxxx3d)
add_subdirectory(xxxxxe-vsxxxm)
add_subdirectory(xxxxxe-vsxxxn)
add_subdirectory(libxxxgame)
add_subdirectory(xxxgame-sexxxiodic)
add_subdirectory(xxxgame-sexxxriven)
add_subdirectory(xxxgame-hook)
add_subdirectory(xxxgame-client)
add_subdirectory(ETWLog)
add_subdirectory(intxxxxxxture)
其中比较重要的点:
设置与子项目的cmakelists 共享变量时使用:
set([variable name] [value] CACHE INTERNAL ["Description text"]) //INTERNAL 还可以换成Private or Public,区别还请高人赐教。
如果遇到多字节编码和单字节编码错误时可以使用:
SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /UMBCS /D_MBCS") //Multi Byte
SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /D_UNICODE /DUNICODE") //Unicode Byte
好像还可以设置预定义宏来改变Multi and Unicode,我没去实验。
*添加子项目:add_subdirectory
子项目
# CMAKE verison
cmake_minimum_required(VERSION 3.15)
# Project name
set(objname sxxxxwebrtc)
project(${objname})
### Source File
set(srcpath xxxwebrtcxxt/)
FILE(GLOB source_files ${srcpath}*.cpp )
set(source ${source_files} )
## addtion include directory
set(add_include_dir ../../../xxxer-webrtc)
## addtion library directory
set(add_lib_dir ../../..xBoost/lib/x64)
## addtion library
if(${CMAKE_BUILD_TYPE} STREQUAL Debug)
set(add_lib owxx.lib libboost_system-vc141-mt-sgd-x64-1_67.lib libboost_random-vc141-mt-sgd-x64-1_67.lib libboost_date_time-vc141-mt-sgd-x64-1_67.lib)
else()
set(add_lib owxxase.lib libboost_system-vc141-mt-s-x64-1_67.lib libboost_random-vc141-mt-s-x64-1_67.lib libboost_date_time-vc141-mt-s-x64-1_67.lib)
endif()
set(add_lib ${add_lib} secxxxmm.lib ${build_output_directory}/xxd/txxl.lib)
## Preprocessor Definitions
if(${CMAKE_BUILD_TYPE} STREQUAL Debug)
set(preprocessor_macroa -D__xxDC_LIMxxxINGS)
else()
set(preprocessor_macroa -D__xxC_xxMxxxxxxRNINGS)
endif()
### Set Statically link the runtime libraries
add_compile_options(
$<$<CONFIG:>:/MT> #---------|
$<$<CONFIG:Debug>:/MTd> #---|-- Statically link the runtime libraries
$<$<CONFIG:Release>:/MT> #--|
)
### Configruation object
include_directories(${base_add_include} ${add_include_dir})
link_directories(${base_link_directory} ${add_lib_dir})
link_libraries(${exbase_lib} ${add_lib})
add_definitions(${base_preprocessor} ${preprocessor_macroa})
### Set build output directory
SET(LIBRARY_OUTPUT_PATH ${build_output_directory}/xxod)
### generate dynamic library
add_library(${objname} SHARED ${source})
### dependencies
add_dependencies(${objname} xxxgame xxxdl)
其中比较重要的点:
Set Statically link the runtime libraries following:
add_compile_options(
$<$<CONFIG:>:/MT> #---------|
$<$<CONFIG:Debug>:/MTd> #---|-- Statically link the runtime libraries
$<$<CONFIG:Release>:/MT> #--|
)
add_compile_options(
$<$<CONFIG:>:/MD> #---------|
$<$<CONFIG:Debug>:/MDd> #---|-- Statically link the runtime libraries
$<$<CONFIG:Release>:/MD> #--|
)
一个是static link multi thread , 一个是Dynamic link multi thread. 目前的水平也只能识别这个错误,不知其所以然。
Release(发布) 目录
即存放项目namake生成的 *.exe, *.dll, *.lib, *.a, *.o 以及debug文件。
SET(LIBRARY_OUTPUT_PATH [build directory])