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 (если мне даже нужно об этом беспокоиться?), И он не очень гибкий.