1. 程式人生 > >cmake設定msvc的執行庫(runtime library)塈指定openjpeg使用靜態庫

cmake設定msvc的執行庫(runtime library)塈指定openjpeg使用靜態庫

cmake這個跨平臺的make工具功能已經很強大了,但它也有不足的地方,就是本文的標題。
在用cmake生成NMake的Makefile或visual studio的.sln時,如何指定執行庫(/MD /MT)?
原本,我以為可以在CMAKE的手冊中找到一個command或PROPERTY或VARIABLE,簡單的呼叫或設定一下就可以了,很遺憾,把整個CMAKE manual翻了幾遍也沒找到,沒捷徑,只能寫程式碼實現。
其實在翻手冊之前我已經有了答案,就是照抄開源專案libjpeg_turbo的CMakeLists.txt中的程式碼,我只是不甘心,想找到更好的辦法而已。
下面是libjpeg_turbo的CMakeLists.txt中的程式碼片段,這段程式碼對於MSVC工程強制所有target的所有build型別(DEBUG/RELEASE/MINSIZEREL/RELWITHDEBINFO)使用C靜態庫。
程式碼中文註釋是博主加的。

#判斷編譯器型別
if(MSVC)
#新增一個名為WITH_CRT_DLL的開關選項,
#這樣就可以在cmake-gui中或在命令列隨時修改該開關選項。
  option(WITH_CRT_DLL
    "Link all libjpeg-turbo libraries and executables with the C run-time DLL (msvcr*.dll) instead of the static C run-time library (libcmt*.lib.)  The default is to use the C run-time DLL only with the libraries and executables that need it."
FALSE) if(NOT WITH_CRT_DLL) # for迴圈修改所有CMAKE_<LANG>_FLAGS開關的編譯選項變數,用正則表示式將/MD替換成/MT # Use the static C library for all build types foreach(var CMAKE_C_FLAGS CMAKE_C_FLAGS_DEBUG CMAKE_C_FLAGS_RELEASE CMAKE_C_FLAGS_MINSIZEREL CMAKE_C_FLAGS_RELWITHDEBINFO) if(${var} MATCHES
"/MD") #正則表示式替換 string(REGEX REPLACE "/MD" "/MT" ${var} "${${var}}") endif() endforeach() endif() add_definitions(-W3 -wd4996) endif()

我將這段程式碼原樣照抄,到openjpeg的CMakeLists.txt中就實現將我要的功能。

因為我的專案程式碼是C++寫的,所以在自己的CMakeLists.txt要使用這段程式碼,還要加上對C++編譯選項的修改

if(MSVC)     
    # Use the static C library for all build types
    foreach(var 
        CMAKE_C_FLAGS CMAKE_C_FLAGS_DEBUG CMAKE_C_FLAGS_RELEASE
        CMAKE_C_FLAGS_MINSIZEREL CMAKE_C_FLAGS_RELWITHDEBINFO
        CMAKE_CXX_FLAGS CMAKE_CXX_FLAGS_DEBUG CMAKE_CXX_FLAGS_RELEASE
        CMAKE_CXX_FLAGS_MINSIZEREL CMAKE_CXX_FLAGS_RELWITHDEBINFO
      )
      if(${var} MATCHES "/MD")
        string(REGEX REPLACE "/MD" "/MT" ${var} "${${var}}")
      endif()
    endforeach()    
endif(MSVC)