MSYS2 CMAKE PATH前缀为Windows格式(C:/),但需要MSYS2/*NIX样式(/C/)才能链接

MSYS2 CMake path prefix is in Windows format (C:/) but needs MSYS2/*nix style (/c/) to link

本文关键字:MSYS2 NIX 样式 链接 前缀 格式 PATH CMAKE Windows      更新时间:2023-10-16

MSYS2中从PACMAN安装的CMAKE似乎在库和标头/标头/包含c:/的路径上,但是所需的实际路径格式是/c/的前缀。我使用过正则替换为kludge,但这不是一个非常优雅的解决方案,我担心这会破坏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

我一直在挖掘解决方案,并看到Windows的Cmake(不是从MSYS2中安装的CMAKE)具有特定于Makysfile发电机,但是必须有一些简单的解决方案来使用MSYS2中可用的CMAKE。我无法想象我是唯一遇到这个问题的人。有人知道干净的解决方案吗?

更新:这是CMakelists.txt,没有正则替换hack。这将失败,错误

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.

在制造过程中


    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 Native Extension将其推出,而Windows SDK则是基于MSYS2的Windows SDK。同时,我相当确定我的kludge会破坏基于mingw的构建(如果我什至需要担心吗?),这不是很灵活。

问题与mingw软件包的使用方式有关。这些路径以" Windows"格式向后兼容,并保持与Visual Studio等系统的兼容性。唯一的答案是像我在上面指出的那样进行正则替换,或者像我现在选择的那样重新编译MSYS2中的库。

作为一般指南,包装名称中没有mingw前缀的软件包没有此"向后兼容"问题,据我所知,不需要这样的解决方法。