Search code examples
c++cmakemingw-w64msys2

CMake cannot find static wxWidgets under msys2


I'm trying to build a project with statically linked wxWidgets (I would just like to point out that it compiles&links just fine with shared libraries). This is relevant part of my CMakeLists.txt:

set(wxWidgets_USE_STATIC ON)
find_package(wxWidgets REQUIRED)

and this is error I get:

$ make
-- Boost version: 1.64.0
-- Found the following Boost libraries:
--   system
--   filesystem
--   program_options
CMake Error at C:/Dev/msys64/mingw64/share/cmake-3.9/Modules/FindPackageHandleStandardArgs.cmake:137 (message):
  Could NOT find wxWidgets (missing: wxWidgets_LIBRARIES)
Call Stack (most recent call first):
  C:/Dev/msys64/mingw64/share/cmake-3.9/Modules/FindPackageHandleStandardArgs.cmake:377 (_FPHSA_FAILURE_MESSAGE)
  C:/Dev/msys64/mingw64/share/cmake-3.9/Modules/FindwxWidgets.cmake:953 (find_package_handle_standard_args)
  CMakeLists.txt:16 (find_package)


-- Configuring incomplete, errors occurred!

The static libraries are however installed

$ ls -l /mingw64/lib | grep libwx
-rw-r--r-- 1 tv185035 Domain Users 668K Sep 13 20:16 libwx_baseu_net-3.0.a
-rw-r--r-- 1 tv185035 Domain Users 453K Sep 13 20:14 libwx_baseu_net-3.0.dll.a
-rw-r--r-- 1 tv185035 Domain Users  84K Sep 13 20:16 libwx_baseu_xml-3.0.a
-rw-r--r-- 1 tv185035 Domain Users  68K Sep 13 20:14 libwx_baseu_xml-3.0.dll.a
-rw-r--r-- 1 tv185035 Domain Users 5.9M Sep 13 20:16 libwx_baseu-3.0.a
-rw-r--r-- 1 tv185035 Domain Users 4.6M Sep 13 20:14 libwx_baseu-3.0.dll.a
-rw-r--r-- 1 tv185035 Domain Users 6.8M Sep 13 20:16 libwx_mswu_adv-3.0.a
-rw-r--r-- 1 tv185035 Domain Users 3.2M Sep 13 20:14 libwx_mswu_adv-3.0.dll.a
-rw-r--r-- 1 tv185035 Domain Users 1.8M Sep 13 20:16 libwx_mswu_aui-3.0.a
-rw-r--r-- 1 tv185035 Domain Users 1.1M Sep 13 20:14 libwx_mswu_aui-3.0.dll.a
-rw-r--r-- 1 tv185035 Domain Users  28M Sep 13 20:16 libwx_mswu_core-3.0.a
-rw-r--r-- 1 tv185035 Domain Users  12M Sep 13 20:14 libwx_mswu_core-3.0.dll.a
-rw-r--r-- 1 tv185035 Domain Users 278K Sep 13 20:16 libwx_mswu_gl-3.0.a
-rw-r--r-- 1 tv185035 Domain Users 175K Sep 13 20:14 libwx_mswu_gl-3.0.dll.a
-rw-r--r-- 1 tv185035 Domain Users 2.6M Sep 13 20:16 libwx_mswu_html-3.0.a
-rw-r--r-- 1 tv185035 Domain Users 1.4M Sep 13 20:14 libwx_mswu_html-3.0.dll.a
-rw-r--r-- 1 tv185035 Domain Users 2.2M Sep 13 20:16 libwx_mswu_propgrid-3.0.a
-rw-r--r-- 1 tv185035 Domain Users 1.6M Sep 13 20:14 libwx_mswu_propgrid-3.0.dll.a
-rw-r--r-- 1 tv185035 Domain Users 331K Sep 13 20:16 libwx_mswu_qa-3.0.a
-rw-r--r-- 1 tv185035 Domain Users 193K Sep 13 20:14 libwx_mswu_qa-3.0.dll.a
-rw-r--r-- 1 tv185035 Domain Users 1.6M Sep 13 20:16 libwx_mswu_ribbon-3.0.a
-rw-r--r-- 1 tv185035 Domain Users 646K Sep 13 20:14 libwx_mswu_ribbon-3.0.dll.a
-rw-r--r-- 1 tv185035 Domain Users 3.6M Sep 13 20:16 libwx_mswu_richtext-3.0.a
-rw-r--r-- 1 tv185035 Domain Users 2.4M Sep 13 20:14 libwx_mswu_richtext-3.0.dll.a
-rw-r--r-- 1 tv185035 Domain Users 849K Sep 13 20:16 libwx_mswu_stc-3.0.a
-rw-r--r-- 1 tv185035 Domain Users 2.1M Sep 13 20:14 libwx_mswu_stc-3.0.dll.a
-rw-r--r-- 1 tv185035 Domain Users 404K Sep 13 20:16 libwx_mswu_webview-3.0.a
-rw-r--r-- 1 tv185035 Domain Users 634K Sep 13 20:14 libwx_mswu_webview-3.0.dll.a
-rw-r--r-- 1 tv185035 Domain Users 4.4M Sep 13 20:16 libwx_mswu_xrc-3.0.a
-rw-r--r-- 1 tv185035 Domain Users 1.1M Sep 13 20:14 libwx_mswu_xrc-3.0.dll.a
-rw-r--r-- 1 tv185035 Domain Users  90K Sep 13 20:16 libwxregexu-3.0.a
-rw-r--r-- 1 tv185035 Domain Users 2.7M Sep 13 20:16 libwxscintilla-3.0.a

I have no idea why it refuses to work. Will anyone please help?


Solution

  • Hm, so I didn't get it to work with wxWidgets_USE_STATIC, but following does work (and produce static executable in release version)

    cmake_minimum_required(VERSION 3.9)
    
    set(PROJECT_NAME "jibril")
    
    project(${PROJECT_NAME})
    
    set(BUILD_SHARED_LIBS OFF)
    set(BUILD_STATIC_LIBS ON)
    
    string(TOLOWER "${CMAKE_BUILD_TYPE}" build_type_lower)
    
    if(NOT build_type_lower MATCHES debug)
        set(Boost_USE_STATIC_LIBS ON)
        set(Boost_USE_STATIC_RUNTIME ON)
    endif()
    find_package(
        Boost REQUIRED
            system
            filesystem
            program_options
    )
    find_package(wxWidgets REQUIRED)
    string(
        REPLACE
            ";-Wl,--subsystem,windows;-mwindows"
            ""
            wxWidgets_LIBRARIES
            "${wxWidgets_LIBRARIES}"
    )
    
    add_executable(
        ${PROJECT_NAME}
            src/main.cpp
    )
    target_include_directories(
        ${PROJECT_NAME}
            PUBLIC ${Boost_INCLUDE_DIRS}
            PUBLIC ${wxWidgets_INCLUDE_DIRS}
    )
    target_compile_options(
        ${PROJECT_NAME}
            PRIVATE -Wall
            PRIVATE -Wextra
            PRIVATE -Werror
            PRIVATE -Wduplicated-cond
            PRIVATE -Wduplicated-branches
            PRIVATE -Wlogical-op
            PRIVATE -Wrestrict
            PRIVATE -Wnull-dereference
            #PRIVATE -Wold-style-cast
            #PRIVATE -Wuseless-cast
            #PRIVATE -Wdouble-promotion
            PRIVATE -Wshadow
            #PRIVATE -Wformat=2
    )
    target_link_libraries(
        ${PROJECT_NAME}
            ${Boost_LIBRARIES}
            ${wxWidgets_LIBRARIES}
    
            optimized -static
            optimized -luuid
            optimized -lcomctl32
            optimized -loleacc
            optimized -lpng
            optimized -lz
            optimized -s
    )