windows中打包gtk的问题记录

-ID:/msys64/mingw64/include/pixman-1 -ID:/msys64/mingw64/include/libpng16 -ID:/msys64/mingw64/include/fribidi -LD:/msys64/mingw64/lib -lgtk-4 -lpangowin32-1.0 -lharfbuzz -lpangocairo-1.0 -lpango-1.0 -lgdk_pixbuf-2.0 -lcairo-gobject -lcairo -lgraphene-1.0 -lgio-2.0 -lglib-2.0 -lintl -lgobject-2.0

graphene-1.0 link error (lack of libgraphene-1.0.a )
gtk-4 link error (lack of libgtk-4.a )

.a or .dll.a is in lib folder

文章目录

  • 前言

    • 最近准备写一个局域网通信软件, gtk写 windows网络通信
    • 测试打包时发现了一些问题, 一些平台相关的静态链接动态链接的问题
  • 直接问题:

    • 程序移动到另一个windows平台, 找不到库文件问题, 这些库文件都是配置Gtk开发环境时msys下载的Gtk依赖库
  • 解决思路:

    • 1.编译选项使用-static
      但这又出现了link错误: gtk-4 graphene-1.0 没有这样的文件.
      我用Everything一查 明明就有呢 为什么就这两个提示这个错误呢 ? 用Everything与其他Gtk依赖库文件一对比
      发现缺少了它们自身.a的版本(就是静态链接) 只有.dll版本(动态链接)和.dll.a版本(索引dll的符号表)
      windows中打包gtk的问题记录_第1张图片
      我想用什么去除-static对这两个依赖的影响, 意思是唯独这两个动态链接, 其他的库静态链接. 但我不熟悉cmake, 无果
    • 2.打包dll
      尝试之初发现Gtk的这些windows版本的依赖库总起来有100多MB
      windows中打包gtk的问题记录_第2张图片

    我写一个小程序玩玩, 给我占这么多内存?
    我尝试用ldd 打印出程序依赖, 但除了需要的gtk库外还包含windows系统自身的库, 到其他windows平台是不需要这些库的, 好在gtk库和windows库 有明显的区别
    足以让我写一个字符过滤程序, 过滤掉那些有关windows库信息 然后取出gtk库名
    再写一个文件抽取程序, 把那些同名的gtk依赖库 抽取复制到指定的文件夹, 然后再把.exe文件丢到这个文件夹中 -> 压缩 ->丢到没有Gtk开发环境的windows平台 可顺利运行
    很明显这程序很散装, 散装是不能称重的 有待进一步解决…

  • 后续

cmake_minimum_required(VERSION 3.8)
project(test)
#-Wl,--out-implib,libtest.dll.a
#-Wl,-Bstatic -lgtkmm-4.0  -lglibmm-2.68  -lpangowin32-1.0  -lharfbuzz  -lpango-1.0  -lcairo-gobject  -lglib-2.0  -lintl  -lgobject-2.0  -lgio-2.0  -lsigc-3.0  -lcairo  -lpangomm-2.48  -lgiomm-2.68  -lcairomm-1.16  -lpangocairo-1.0  -lgdk_pixbuf-2.0  -lkernel32 -luser32 -lgdi32 -lwinspool -lshell32 -lole32 -loleaut32 -luuid -lcomdlg32 -ladvapi32 -Wl,-Bdynamic -lgtk-4 -lgraphene-1.0
#set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++17 -Wl,-Bstatic -lgtkmm-4.0  -lglibmm-2.68  -lpangowin32-1.0  -lharfbuzz  -lpango-1.0  -lcairo-gobject  -lglib-2.0  -lintl  -lgobject-2.0  -lgio-2.0  -lsigc-3.0  -lcairo  -lpangomm-2.48  -lgiomm-2.68  -lcairomm-1.16  -lpangocairo-1.0  -lgdk_pixbuf-2.0  -lkernel32 -luser32 -lgdi32 -lwinspool -lshell32 -lole32 -loleaut32 -luuid -lcomdlg32 -ladvapi32 -Wl,-Bdynamic -lgtk-4 -lgraphene-1.0")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++17 -static")
find_package(PkgConfig)
pkg_check_modules(GTKMM gtkmm-4.0)

include_directories(${GTKMM_INCLUDE_DIRS})
link_directories(${GTKMM_LIBRARY_DIRS})

set(SOURCE_FILES main.cpp Functional.cpp)
#set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++17 -Wl,-Bstatic -lgtkmm-4.0  -lglibmm-2.68  -lpangowin32-1.0  -lharfbuzz  -lpango-1.0  -lcairo-gobject  -lglib-2.0  -lintl  -lgobject-2.0  -lgio-2.0  -lsigc-3.0  -lcairo  -lpangomm-2.48  -lgiomm-2.68  -lcairomm-1.16  -lpangocairo-1.0  -lgdk_pixbuf-2.0  -lkernel32 -luser32 -lgdi32 -lwinspool -lshell32 -lole32 -loleaut32 -luuid -lcomdlg32 -ladvapi32 -Wl,-Bdynamic -lgtk-4 -lgraphene-1.0")

add_executable(test WIN32  ${SOURCE_FILES})

set(CMAKE_EXE_LINKER_FLAGS "-Wl,-Bdynamic -lgtk-4 -lgraphene-1.0")
target_link_libraries(test ${GTKMM_LIBRARIES})

编译能过但是没有效果…
这很奇怪, 好像clion有学习能力一样
从某些方面来看这玩意比vs2022还难搞
https://download.gnome.org/binaries/win64/gtkmm/
https://www.cnblogs.com/findumars/p/7483945.html

你可能感兴趣的:(GTK,windows,gtk程序打包)