Префикс пути MSake2 CMake находится в формате Windows (C: /), но для ссылки требуется стиль MSYS2 / * nix (/ c /) - PullRequest
0 голосов
/ 19 февраля 2019

CMake, установленный из pacman в MSYS2, кажется, префикс библиотеки и пути заголовка / включает в себя C: /, но фактический необходимый формат пути является префиксом / c /.Я использовал замену регулярных выражений в качестве ключа, но это не очень элегантное решение, и я боюсь, что это сломает такие вещи, как MingW.

Просто для справки: путь к библиотеке, который использует CMake:

 C:/msys64/mingw64/include/gtk-3.0;C:/msys64/mingw64/include/cairo;C:/msys64/mingw64/include;C:/msys64/mingw64/include/pango-1.0;C:/msys64/mingw64/include/fribidi;C:/msys64/mingw64/include;C:/msys64/mingw64/include/atk-1.0;C:/msys64/mingw64/include/cairo;C:/msys64/mingw64/include/pixman-1;C:/msys64/mingw64/include;C:/msys64/mingw64/include/freetype2;C:/msys64/mingw64/include;C:/msys64/mingw64/include/harfbuzz;C:/msys64/mingw64/include/libpng16;C:/msys64/mingw64/include/gdk-pixbuf-2.0;C:/msys64/mingw64/include/libpng16;C:/msys64/mingw64/include;C:/msys64/mingw64/lib/libffi-3.2.1/include;C:/msys64/mingw64/include/glib-2.0;C:/msys64/mingw64/lib/glib-2.0/include;C:/msys64/mingw64/include

и должно быть:

 /c//msys64/mingw64/include/gtk-3.0;/c//msys64/mingw64/include/cairo;/c//msys64/mingw64/include;/c//msys64/mingw64/include/pango-1.0;/c//msys64/mingw64/include/fribidi;/c//msys64/mingw64/include;/c//msys64/mingw64/include/atk-1.0;/c//msys64/mingw64/include/cairo;/c//msys64/mingw64/include/pixman-1;/c//msys64/mingw64/include;/c//msys64/mingw64/include/freetype2;/c//msys64/mingw64/include;/c//msys64/mingw64/include/harfbuzz;/c//msys64/mingw64/include/libpng16;/c//msys64/mingw64/include/gdk-pixbuf-2.0;/c//msys64/mingw64/include/libpng16;/c//msys64/mingw64/include;/c//msys64/mingw64/lib/libffi-3.2.1/include;/c//msys64/mingw64/include/glib-2.0;/c//msys64/mingw64/lib/glib-2.0/include;/c//msys64/mingw64/include

Я искал решение и увидел, что CMake для Windows (не CMake, установленный из MSYS2) имеет специальный генератор make-файлов MSYS., но должно быть какое-то простое решение для использования CMake, доступного в MSYS2.Я не могу себе представить, что я единственный, кто столкнулся с этой проблемой.Кто-нибудь знает о чистом решении?

ОБНОВЛЕНИЕ: Вот CMakeLists.txt без взлома замены регулярного выражения.Это происходит с ошибкой

C:/msys64/home/username/sample/src/main.cpp:1:10 fatal error: gtk/gtk.h: No such file or directory
 #include <gtk/gtk.h>

compilation terminated.

во время make.


    cmake_minimum_required(VERSION 3.12)

    project(sample CXX)

    # Find GTK+ headers/libs with PkgConfig
    find_package(PkgConfig REQUIRED)
    pkg_check_modules(GTK3 REQUIRED gtk+-3.0)

    include_directories(${GTK3_INCLUDE_DIRS})
    link_directories(${GTK3_LIBRARY_DIRS})

    add_definitions(${GTK3_CFLAGS_OTHER})

    set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/lib/natives)
    set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/lib/natives)
    set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin)

    add_executable(sample src/main.cpp)

    target_link_libraries(sample ${GTK3_LIBRARIES})

Для main.cpp просто используйте стандартный GTK + hello world


    #include <gtk/gtk.h>

    int
    main (int   argc,
    char *argv[])
    {
      GtkWidget *window;

      gtk_init (&argc, &argv);

      window = gtk_window_new (GTK_WINDOW_TOPLEVEL);

      g_signal_connect (window, "destroy", G_CALLBACK (gtk_main_quit), NULL);

      gtk_widget_show (window);

      gtk_main ();

      return 0;
    }

, чтобы компиляция работалаЯ использую следующий CMake kludge:


    cmake_minimum_required(VERSION 3.12)

    project(sample CXX)

    # Find GTK+ headers/libs with PkgConfig
    find_package(PkgConfig REQUIRED)
    pkg_check_modules(GTK3 REQUIRED gtk+-3.0)

    # Generated paths starting with "C:" need to be converted to /c/ to work with MSYS2
    # TODO remove this or do it some way better at some point in the future
    if(MSYS OR MINGW)
        string(REGEX REPLACE "C:" "/c/" GTK3_INCLUDE_DIRS "${GTK3_INCLUDE_DIRS}")
    endif(MSYS OR MINGW)

    include_directories(${GTK3_INCLUDE_DIRS})
    link_directories(${GTK3_LIBRARY_DIRS})

    add_definitions(${GTK3_CFLAGS_OTHER})

    set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/lib/natives)
    set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/lib/natives)
    set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin)

    add_executable(sample src/main.cpp)

    target_link_libraries(sample ${GTK3_LIBRARIES})

Обратите внимание на ЗАМЕНУ РЕГЕКСА.

Еще одна вещь, которую стоит отметить, я использую только такие инструменты, как cmake, и библиотеки / заголовки/так далее.Я установил из pacman в MSYS2, и я бы предпочел, чтобы так было, потому что я собираюсь что-то развернуть, основываясь на нативном расширении Ruby и Windows SDK для него на основе MSYS2.В то же время я вполне уверен, что мой kludge сломает сборки на основе MingW (если мне даже нужно об этом беспокоиться?), И он не очень гибкий.

1 Ответ

0 голосов
/ 16 мая 2019

Проблема связана с тем, как пакеты MingW были / были портированы на MSYS2.Пути представлены в формате «Windows» для обратной совместимости и сохранения совместимости с такими системами, как Visual Studio.Единственный ответ - выполнить замену регулярных выражений, как я указал выше, или просто перекомпилировать библиотеки в MSYS2, как я сейчас решил.

Как общее руководство, пакеты, доступные в MSYS2, без префиксов mingwв именах пакетов нет этой проблемы «обратной совместимости» и, насколько я знаю, такой обходной путь не требуется.

...