• 1730阅读
  • 15回复

[提问]关于Qt 静态编译后打包的可执行程序exe疑问 [复制链接]

上一主题 下一主题
离线lwei24
 

只看楼主 倒序阅读 楼主  发表于: 2021-11-19
各位大佬,通过windows Qt5编写的应用程序,只连接vs2017的一个静态库,QtCreator静态编译后,exe可执行程序有100多MB,为什么会这么大呢?我只是用了一些常用的控件,比如QWidget,QDialog等,各位有什么办法可以减少可执行程序的大小吗?在线等,欢迎各位大佬指点,小弟在此先谢过了。
离线hitler++

只看该作者 1楼 发表于: 2021-11-19
如果你用的cmake ,加入这些代码

  set(CMAKE_C_VISIBILITY_PRESET hidden)
    set(CMAKE_CXX_VISIBILITY_PRESET hidden)
    set(CMAKE_VISIBILITY_INLINES_HIDDEN hidden)

    set(CMAKE_C_FLAGS_RELEASE "${CMAKE_C_FLAGS_RELEASE} -ffunction-sections -fdata-sections -fno-ident -Os -s -pipe -fPIC")
    set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} -ffunction-sections -fdata-sections -Os -s -pipe -fPIC")
    set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} -fno-bounds-check -fno-enforce-eh-specs -fno-optional-diags -fno-ident")
    set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -Wl,--gc-sections -Wl,-soname -Wl,--kill-at -Wl,--as-needed -Wl,-x")

哦,对了,这个只适合gcc或mingw, vs似乎没什么用
离线clickto

只看该作者 2楼 发表于: 2021-11-19
1、程序编译的版本?debug还是release?
2、如果实在有这么大的话,又在意大小,可以加个压缩壳,一般只使用核心控件的软件都可以控制在10m以内

顺便说一下,如果没有购买商业版而使用静态编译的话,注意授权问题。
离线lwei24

只看该作者 3楼 发表于: 2021-11-22
回 hitler++ 的帖子
hitler++:如果你用的cmake ,加入这些代码
  set(CMAKE_C_VISIBILITY_PRESET hidden)
    set(CMAKE_CXX_VISIBILITY_PRESET hidden)
    set(CMAKE_VISIBILITY_INLINES_HIDDEN hidden)
....... (2021-11-19 17:20) 

谢谢,不过,我用的是qmake
离线lwei24

只看该作者 4楼 发表于: 2021-11-22
回 clickto 的帖子
clickto:1、程序编译的版本?debug还是release?
2、如果实在有这么大的话,又在意大小,可以加个压缩壳,一般只使用核心控件的软件都可以控制在10m以内
顺便说一下,如果没有购买商业版而使用静态编译的话,注意授权问题。 (2021-11-19 20:20) 

release,不是作为程序发行的版本吗?那个,没有购买商业版而使用静态编译,要注意哪些授权问题呢?请大佬指点一下
离线hitler++

只看该作者 5楼 发表于: 2021-11-22
回 clickto 的帖子
clickto:1、程序编译的版本?debug还是release?
2、如果实在有这么大的话,又在意大小,可以加个压缩壳,一般只使用核心控件的软件都可以控制在10m以内
顺便说一下,如果没有购买商业版而使用静态编译的话,注意授权问题。 (2021-11-19 20:20) 

文件太大不适合加壳,他的100多M的exe加壳后运行内存也会多100多M
离线clickto

只看该作者 6楼 发表于: 2021-11-22
回 lwei24 的帖子
lwei24:release,不是作为程序发行的版本吗?那个,没有购买商业版而使用静态编译,要注意哪些授权问题呢?请大佬指点一下[表情] (2021-11-22 15:09) 

release就是发行使用的版本,体积会比debug小的多,如果你只是使用常用控件的话,一般来说是不会有太大的,如果有100多m,应该是使用了其他的某些组件。
如果你的程序较大,其他模块也是基于Qt 的话,建议使用动态库的方式使用Qt,一方面,不同的模块可以复用动态库,整体空间占用反而比静态的小,另一方面也可以规避授权问题,就你说的情况,如果你写的软件做商业发布的话,会有版权纠纷的风险。
另,楼上的大佬说的对,小软件可以加壳,大软件没必要,运行的时候还是要在内存展开的,反而增加了解压载入的时间:)
离线lwei24

只看该作者 7楼 发表于: 2021-11-23
回 hitler++ 的帖子
hitler++:文件太大不适合加壳,他的100多M的exe加壳后运行内存也会多100多M (2021-11-22 16:59) 

哦哦
离线lwei24

只看该作者 8楼 发表于: 2021-11-23
回 clickto 的帖子
clickto:release就是发行使用的版本,体积会比debug小的多,如果你只是使用常用控件的话,一般来说是不会有太大的,如果有100多m,应该是使用了其他的某些组件。
如果你的程序较大,其他模块也是基于Qt 的话,建议使用动态库的方式使用Qt,一方面,不同的模块可以复用动态库,整体空间占 .. (2021-11-22 20:03) 

可是,我就用Qt的widgets模块而已,比如常用的控件,QTableWidget、QtreeWidget、QPushButton、QLabel,没想到它静态编译的release版本会这么大,超过100MB,现在除了减少不必要的依赖库或控件,不知道还有什么办法可以减少它的大小。关于你说的动态库的方式,这个暂时不考虑了,因为公司领导做的选择,说真的,即使用动态库,应该也不会小多少。因为我用动态编译的方式去打包这个应用程序,发现除了Qt的那些必要的dll外,就剩下exe应用程序,它也有100多MB。因此,真的是不知道还有啥办法再把它优化变小了……
离线clickto

只看该作者 9楼 发表于: 2021-11-23
100多m的exe???你是不是塞了大量的资源文件在exe里?
离线lwei24

只看该作者 10楼 发表于: 2021-11-25
回 clickto 的帖子
clickto:100多m的exe???你是不是塞了大量的资源文件在exe里?
 (2021-11-23 17:04) 

除了好几个字体库和一些应用程序的必备图片以外,好像没有其他资源了
离线lwei24

只看该作者 11楼 发表于: 2021-11-25
回 clickto 的帖子
clickto:100多m的exe???你是不是塞了大量的资源文件在exe里?
 (2021-11-23 17:04) 

目前我分析到可能造成应用程序编译出来很大,有可能是自己在处理国际化的时候,没有通过Qt的方式去做,而是自己重新调用控件并设置不同的文本和位置。现在,我尝试用Qt的那种加载ts不同语言的方式,不知道会不会减少?
离线lwei24

只看该作者 12楼 发表于: 2021-11-25
回 clickto 的帖子
clickto:100多m的exe???你是不是塞了大量的资源文件在exe里?
 (2021-11-23 17:04) 

很感谢,目前已经减小到十几MB了。最终确认是由于将资源放了好几个字体库导致的编译后变大,但是,我不理解的是我并没有调用这些字体库,为什么编译的时候也会将它编译进去呢?难道不是调用的时候才编译进去的吗?
离线clickto

只看该作者 13楼 发表于: 2021-11-25
你说的机制是程序库文件,而qrc是作为资源,整体二进制打包进exe里的。
如果嫌直接调用外部文件的方式文件太多的话,可以将资源文件单独编译为一个rcc
离线lwei24

只看该作者 14楼 发表于: 2021-11-25
回 clickto 的帖子
clickto:你说的机制是程序库文件,而qrc是作为资源,整体二进制打包进exe里的。
如果嫌直接调用外部文件的方式文件太多的话,可以将资源文件单独编译为一个rcc (2021-11-25 14:49) 

好的,多谢了!
离线mugua001

只看该作者 15楼 发表于: 2021-12-01
回 clickto 的帖子
clickto:1、程序编译的版本?debug还是release?
2、如果实在有这么大的话,又在意大小,可以加个压缩壳,一般只使用核心控件的软件都可以控制在10m以内
顺便说一下,如果没有购买商业版而使用静态编译的话,注意授权问题。 (2021-11-19 20:20) 

加壳,是掩耳盗铃的作法,意义不大。
快速回复
限100 字节
 
上一个 下一个