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中从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前缀的软件包没有此"向后兼容"问题,据我所知,不需要这样的解决方法。
- MSYS2 MinGW程序包中缺少grpc_cpp_plugin协议
- MSYS2 MinGW64 在 Windows 上构建 GMP/MPFR 作为静态库,并将它们链接到使用 CL 编译的
- MSYS2 上的 CMake 冻结
- GLEW 未在 MSYS2 上定位 OpenGL 函数
- 犰狳代码无法在 msys2 和 netbeans 中编译
- 如何在VSCode上使用MSYS2(MSYS64)gdb.exe调试C++
- 如何在 MSYS2 中通过 CMake 构建 c++ Qt5 应用程序
- 如何让 CMAKE 使用 MSYS2 (MINGW) 下的 GNU 工具堆栈
- MSYS2静态QT未定义的参考问题
- C - 无法使用MSYS2和CMAKE链接到BOOST :: LOGGER
- 使用MSYS2安装后如何运行GLADE和DEVHELP
- GTKMM-3.0:使用PKG-Config的程序构建失败的MSYS2 NetBeans
- msys2 和标头位于'wrong'位置
- MSYS2 CMAKE PATH前缀为Windows格式(C:/),但需要MSYS2/*NIX样式(/C/)才能链接
- MSYS2上使用GCC 8.2.1的本本汇编误差
- MSYS2区分大小写并包含在XP上
- SQL API for *NIX C++
- 在 msys2-mingw 上使用 Python/C API
- 如何使用 NIX 标准库删除文件夹中的所有文件,但不删除文件夹
- *nix 上的模板方法专用化