Поиск wxWidgets в CMake с помощью CMAKE_PREFIX_PATH

#c #cmake #wxwidgets

Вопрос:

Я пытаюсь использовать find_package для поиска wxWidgets, который находится внутри местоположения, указанного в моем CMAKE_PREFIX_PATH, однако мне это не удается.

Если я установлю переменную среды WXWIDGETS_ROOT_DIR для установки wxWidgets, то все будет работать нормально. Однако, если я установлю CMAKE_PREFIX_PATH в папку, содержащую мою папку wxWidgets-3.1.4, wx не будет найден.

Как я могу это исправить? Где есть документация о том, что необходимо использовать WXWIDGETS_ROOT_DIR? Я узнал об этом только из другого сообщения о переполнении стека.

Мой CMakeLists.txt:

 ####################
#      Global      #
####################

cmake_minimum_required(VERSION 3.12)
set(CMAKE_CXX_STANDARD 17)



#####################
#      Project      #
#####################

# Header files (relative to "include" directory)
set(HEADERS
    app.h
)

# Source files (relative to "src" directory)
set(SOURCES
    app.cpp
)

# Compiler definitions
set(DEFINES

)

# Compiler options
set(OPTIONS

)

# Project setup
project("CPP-Sandbox"
        VERSION "0.0.1"
        DESCRIPTION "Description"
        LANGUAGES CXX)

add_executable(CPP-Sandbox)

list(TRANSFORM HEADERS PREPEND "include/")
list(TRANSFORM SOURCES PREPEND "src/")

target_include_directories(CPP-Sandbox PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/include)
target_sources(CPP-Sandbox PRIVATE ${SOURCES} ${HEADERS})
target_compile_definitions(CPP-Sandbox PRIVATE ${DEFINES})
target_compile_options(CPP-Sandbox PRIVATE ${OPTIONS})

set_target_properties(CPP-Sandbox PROPERTIES
    RUNTIME_OUTPUT_DIRECTORY "bin"
    WIN32_EXECUTABLE true
)



####################
#   Dependencies   #
####################


find_package(wxWidgets REQUIRED COMPONENTS core base)
include(${wxWidgets_USE_FILE})
target_link_libraries(CPP-Sandbox ${wxWidgets_LIBRARIES})
 

Комментарии:

1. «Где есть документация о том, что необходимо использовать WXWIDGETS_ROOT_DIR?» — Документация находится здесь: cmake.org/cmake/help/latest/module/FindwxWidgets.html . Если вы хотите узнать, почему настройка CMAKE_PREFIX_PATH не работает, вам необходимо предоставить более подробную информацию: ваш код, точное сообщение об ошибке, размещение wxWidgets и т. д.

2. Я добавил свой CMakeLists.txt, но респт я уже объяснил. Это просто означает, что wxWidgets не могут быть найдены. Это помещено в папку «wxWidgets-3.1.4», которая находится внутри моей папки CMAKE_PREFIX_PATH

3. «Это помещено в папку «wxWidgets-3.1.4″, которая находится внутри моей папки CMAKE_PREFIX_PATH» — Вам, вероятно, нужно добавить этот wxWidgets-3.1.4 подкаталог в путь в CMAKE_PREFIX_PATH переменной. По крайней мере, данный скрипт не выполняет поиск в wxWidgets-3.1.4 подкаталоге.

Ответ №1:

Я установил в Windows wxWidgets 3.1.4 под C:/wx314_install. Он содержит файлы заголовков и библиотек, необходимые для использования wxWidgets. После этого вам нужно настроить различные переменные для CMake, чтобы найти библиотеку.

Это мое CMakeFile.txt где я говорю CMake, где найти wxWidgets в зависимости от того, в каком режиме программа компилируется, отлаживается или выпускается. Вероятно, это последнее можно сделать по-другому.

 cmake_minimum_required(VERSION 3.20)

message(STATUS "Building SUN")

set(wxWidgets_USE_DEBUG ON)
set(wxWidgets_USE_UNICODE ON)

IF(CMAKE_BUILD_TYPE MATCHES Release)
    message(STATUS "Release mode" )
    set(wxWidgets_ROOT_DIR C:/wx314_install/Release)
    set(wxWidgets_LIB_DIR C:/wx314_install/Release/lib/vc_x64_lib)
    set(wxWidgets_INCLUDE_DIRS C:/wx314_install/Release/include)
ENDIF()

IF(CMAKE_BUILD_TYPE MATCHES Debug)
    message(STATUS "Debug mode" )
    set(wxWidgets_ROOT_DIR "C:/wx314_install/Debug")
    set(wxWidgets_LIB_DIR C:/wx314_install/Debug/lib/vc_x64_lib)
    set(wxWidgets_INCLUDE_DIRS C:/wx314_install/Debug/include)
ENDIF()


message(STATUS "wxWidgets location ${wxWidgets_ROOT_DIR}")
# Note that for MinGW users the order of libs is important!

find_package(wxWidgets REQUIRED net gl core base)

include(${wxWidgets_USE_FILE})

add_executable(app WIN32)

target_sources(app PRIVATE
        src/app.cpp)

target_link_libraries(app PRIVATE ${wxWidgets_LIBRARIES})
 

Это извлечено из этого минимального проекта.