Findspdlog.cmake 7.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205
  1. # SPDLOG库分为1.14.1和1.15.1,1.14.1是使用Qt5.12.12编译的,只能使用在Qt5环境中
  2. # 1.15.1是没有带Qt的环境编译的,支持Qt5和Qt6,编译器版本是GCC11.3
  3. # 静态库好像不能跨GCC版本使用,链接时会报错,提示找不到符号
  4. message(STATUS "***** Find spdlog Library *****")
  5. #寻找头文件,需要判断gcc编译器版本
  6. unset(spdlog_INCLUDE_DIR CACHE)
  7. unset(SPDLOG_INC_DIR CACHE)
  8. #判断操作系统
  9. if(CMAKE_SYSTEM_NAME MATCHES "Windows")
  10. if(CMAKE_CXX_COMPILER_ID MATCHES "GNU")
  11. if(CMAKE_CXX_COMPILER_VERSION VERSION_LESS 7.3)
  12. message(STATUS "GCC编译器版本过低,请使用GCC7.3及以上版本")
  13. return()
  14. elseif(CMAKE_CXX_COMPILER_VERSION VERSION_LESS 11.2 AND CMAKE_CXX_COMPILER_VERSION VERSION_GREATER 7.2)
  15. set(SPDLOG_V 1.14.1)
  16. set(SPDLOG_INC_DIR ${CMAKE_CURRENT_LIST_DIR}/include_1.14.1)
  17. elseif(CMAKE_CXX_COMPILER_VERSION VERSION_GREATER 11.1)
  18. set(SPDLOG_V 1.15.1)
  19. set(SPDLOG_INC_DIR ${CMAKE_CURRENT_LIST_DIR}/include_1.15.1)
  20. endif()
  21. elseif(CMAKE_CXX_COMPILER_ID MATCHES "MSVC")
  22. #MSVC编译器
  23. set(SPDLOG_V 1.14.1)
  24. set(SPDLOG_INC_DIR ${CMAKE_CURRENT_LIST_DIR}/include_1.14.1)
  25. endif()
  26. elseif(CMAKE_SYSTEM_NAME MATCHES "Linux")
  27. set(SPDLOG_V 1.14.1)
  28. set(SPDLOG_INC_DIR ${CMAKE_CURRENT_LIST_DIR}/include_1.14.1)
  29. elseif(CMAKE_SYSTEM_NAME MATCHES "Darwin")
  30. set(SPDLOG_V 1.14.1)
  31. set(SPDLOG_INC_DIR ${CMAKE_CURRENT_LIST_DIR}/include_1.14.1)
  32. else()
  33. message(STATUS "操作系统:未知")
  34. endif()
  35. list(APPEND spdlog_INCLUDE_DIR ${SPDLOG_INC_DIR})
  36. list(APPEND spdlog_INCLUDE_DIR ${SPDLOG_INC_DIR}/spdlog)
  37. #包含fmt头文件,使用fmt的时候包含fmt/bundled/format.h这样的完整目录
  38. list(APPEND spdlog_INCLUDE_DIR ${SPDLOG_INC_DIR}/spdlog/fmt)
  39. list(APPEND spdlog_INCLUDE_DIR ${CMAKE_CURRENT_LIST_DIR}/Logs)
  40. #添加源文件
  41. unset(spdlog_SOURCES CACHE)
  42. set(spdlog_SOURCES ${CMAKE_CURRENT_LIST_DIR}/Logs/loginit.cpp)
  43. unset(spdlog_LIBRARY CACHE)
  44. unset(spdlog_STATIC_LIBRARY CACHE)
  45. unset(SPDLOG_LIB_DIR CACHE)
  46. #查找库文件,需要判断操作系统,位数
  47. if(CMAKE_SYSTEM_NAME MATCHES "Windows")
  48. #GCC编译器
  49. if(CMAKE_CXX_COMPILER_ID MATCHES "GNU")
  50. #64位
  51. if(CMAKE_SIZEOF_VOID_P EQUAL 8)
  52. #GCC7.3版本
  53. if(SPDLOG_V EQUAL 1.14.1)
  54. set(SPDLOG_LIB_DIR ${CMAKE_CURRENT_LIST_DIR}/windows/gcc7.3)
  55. #GCC11.2版本
  56. elseif(SPDLOG_V EQUAL 1.15.1)
  57. set(SPDLOG_LIB_DIR ${CMAKE_CURRENT_LIST_DIR}/windows/gcc11.2)
  58. #默认版本
  59. else()
  60. set(SPDLOG_LIB_DIR ${CMAKE_CURRENT_LIST_DIR}/windows/gcc11.2)
  61. endif()
  62. #动态库
  63. if(CMAKE_BUILD_TYPE MATCHES "Debug")
  64. list(APPEND spdlog_LIBRARY ${SPDLOG_LIB_DIR}/libspdlogd.dll)
  65. else()
  66. list(APPEND spdlog_LIBRARY ${SPDLOG_LIB_DIR}/libspdlog.dll)
  67. endif()
  68. #静态库
  69. if(ENABLE_SPDLOG_STATIC_LIB)
  70. if(CMAKE_BUILD_TYPE MATCHES "Debug")
  71. list(APPEND spdlog_STATIC_LIBRARY ${SPDLOG_LIB_DIR}/libspdlogd.a)
  72. else()
  73. list(APPEND spdlog_STATIC_LIBRARY ${SPDLOG_LIB_DIR}/libspdlog.a)
  74. endif()
  75. endif()
  76. #32位
  77. elseif(CMAKE_SIZEOF_VOID_P EQUAL 4)
  78. set(SPDLOG_LIB_DIR ${CMAKE_CURRENT_LIST_DIR}/windows/gcc7.3_32)
  79. #动态库
  80. if(CMAKE_BUILD_TYPE MATCHES "Debug")
  81. list(APPEND spdlog_LIBRARY ${SPDLOG_LIB_DIR}/libspdlogd.dll)
  82. else()
  83. list(APPEND spdlog_LIBRARY ${SPDLOG_LIB_DIR}/libspdlog.dll)
  84. endif()
  85. #静态库
  86. if(ENABLE_SPDLOG_STATIC_LIB)
  87. if(CMAKE_BUILD_TYPE MATCHES "Debug")
  88. list(APPEND spdlog_STATIC_LIBRARY ${SPDLOG_LIB_DIR}/libspdlogd.a)
  89. else()
  90. list(APPEND spdlog_STATIC_LIBRARY ${SPDLOG_LIB_DIR}/libspdlog.a)
  91. endif()
  92. endif()
  93. endif()
  94. #MSVC编译器
  95. elseif(CMAKE_CXX_COMPILER_ID MATCHES "MSVC")
  96. set(SPDLOG_LIB_DIR ${CMAKE_CURRENT_LIST_DIR}/windows/msvc2022)
  97. if(CMAKE_BUILD_TYPE MATCHES "Debug")
  98. list(APPEND spdlog_LIBRARY ${SPDLOG_LIB_DIR}/spdlogd.lib)
  99. else()
  100. list(APPEND spdlog_LIBRARY ${SPDLOG_LIB_DIR}/spdlog.lib)
  101. endif()
  102. endif()
  103. #添加Linux版本
  104. elseif(CMAKE_SYSTEM_NAME MATCHES "Linux")
  105. set(SPDLOG_LIB_DIR ${CMAKE_CURRENT_LIST_DIR}/linux/gcc8.3)
  106. if(CMAKE_BUILD_TYPE MATCHES "Debug")
  107. list(APPEND spdlog_LIBRARY ${SPDLOG_LIB_DIR}/libspdlogd.so)
  108. else()
  109. list(APPEND spdlog_LIBRARY ${SPDLOG_LIB_DIR}/libspdlog.so)
  110. endif()
  111. # list(APPEND spdlog_LIBRARY pthread)
  112. if(ENABLE_SPDLOG_STATIC_LIB)
  113. if(CMAKE_BUILD_TYPE MATCHES "Debug")
  114. list(APPEND spdlog_STATIC_LIBRARY ${SPDLOG_LIB_DIR}/libspdlogd.a)
  115. else()
  116. list(APPEND spdlog_STATIC_LIBRARY ${SPDLOG_LIB_DIR}/libspdlog.a)
  117. endif()
  118. #这里需要显式的链接依赖库,或者使用target_link_options(appname PRIVATE "-Wl,--copy-dt-needed-entries")来让gcc递归搜索依赖库
  119. # list(APPEND spdlog_STATIC_LIBRARY pthread)
  120. endif()
  121. #MacOS版本
  122. elseif(CMAKE_SYSTEM_NAME MATCHES "Darwin")
  123. #MacOS版本
  124. if(CMAKE_BUILD_TYPE MATCHES "Debug")
  125. list(APPEND spdlog_LIBRARY ${CMAKE_CURRENT_LIST_DIR}/macos/libspdlog.dylib)
  126. else()
  127. list(APPEND spdlog_LIBRARY ${CMAKE_CURRENT_LIST_DIR}/macos/libspdlog.dylib)
  128. endif()
  129. endif()
  130. #检查是否找到库
  131. if(spdlog_INCLUDE_DIR AND (spdlog_LIBRARY OR spdlog_STATIC_LIBRARY))
  132. set(spdlog_FOUND TRUE)
  133. set(spdlog_VERSION ${SPDLOG_V})
  134. message(STATUS "如果需要使用静态库,定义“ ENABLE_SPDLOG_STATIC_LIB ”变量")
  135. # message(STATUS "include : spdlog_INCLUDE_DIR")
  136. # if(spdlog_LIBRARY)
  137. # message(STATUS "Library : spdlog_LIBRARY")
  138. # endif()
  139. # if(ENABLE_SPDLOG_STATIC_LIB)
  140. # message(STATUS "Static Library : spdlog_STATIC_LIBRARY")
  141. # endif()
  142. message(STATUS "使用方式: target_link_libraries(External::spdlog)")
  143. else()
  144. set(spdlog_FOUND FALSE)
  145. endif()
  146. message(STATUS "spdlog FOUND: ${spdlog_FOUND}")
  147. message(STATUS "spdlog Version: ${spdlog_VERSION}")
  148. message(STATUS "--------------------------------------------------")
  149. #导入目标
  150. if(spdlog_FOUND)
  151. if(NOT TARGET External::spdlog)
  152. add_library(External::spdlog UNKNOWN IMPORTED)
  153. #添加头文件
  154. set_target_properties(External::spdlog PROPERTIES
  155. INTERFACE_INCLUDE_DIRECTORIES "${spdlog_INCLUDE_DIR}")
  156. #添加库文件
  157. if(ENABLE_SPDLOG_STATIC_LIB)
  158. set_target_properties(External::spdlog PROPERTIES
  159. IMPORTED_LOCATION "${spdlog_STATIC_LIBRARY}")
  160. else()
  161. set_target_properties(External::spdlog PROPERTIES
  162. IMPORTED_LOCATION "${spdlog_LIBRARY}")
  163. endif()
  164. #添加spdlog需要的依赖库
  165. if(CMAKE_SYSTEM_NAME MATCHES "Linux")
  166. set_target_properties(External::spdlog PROPERTIES
  167. INTERFACE_LINK_LIBRARIES "pthread")
  168. elseif(CMAKE_SYSTEM_NAME MATCHES "Windows")
  169. endif()
  170. #添加源文件
  171. set_target_properties(External::spdlog PROPERTIES
  172. INTERFACE_SOURCES "${spdlog_SOURCES}")
  173. endif()
  174. endif()
  175. # 标记这些变量为高级变量
  176. mark_as_advanced(
  177. spdlog_INCLUDE_DIR
  178. spdlog_LIBRARY
  179. spdlog_STATIC_LIBRARY
  180. )