在ubuntu上使用wxWidgets成功开发一个图形界面程序
编译wxWidgets
下载最新版的源码,wxWidgets-3.0.2。wxWidgets在liunx是通过wxGTK实现的。wxGTK和wxWidgets的源码打包在一起。wxGTK依赖GTK+,当前版本依赖高于2.8.2的版本。我安装了3.0版本的GTK+。apt-get install gtk+-3.0-dev。一般开发用的库,都有个-dev结尾,这是个约定。开发用的库包含了头文件和文档之类的东西。
为了让不同平台wxWidgets编译之后放到各自的文件夹下,先在解压得到的文件夹下创建一目录。
mkdir gtk-build,release编译。mkdir gtkd-build,debug编译。
进入gtkd-build。执行下面的配置指令。
../configure --with-gtk=3 --enable-unicode --disable-shared --enable-debug
执行过程中会检查编译环境是否符合要求。就是各种编译软件,各种依赖库是否都具备。检查的过程中有提示,失败了的地方就说明确依赖软件。直接apt-get安装就好了。当配置成功之后,执行一下make指令。就能完成编译。
../configure 的各种参数doc文件夹下的install.txt都有说明。编译时根据需求打开和关闭一些功能将会省不是事情。
因为系统中已经安装了wxWidgets,所以不能make install,如果编译成动态版本的会导致冲突。
编写第一个程序
使用codeblocks按照向导很容易就创建了wxWidgets工程。记住,设计器选择wxSmith。这个和codeblocks是集成的。我选择的是dialogbased的应用程序。
然后开始编辑工程得编译选项。
这个是最绕脑的。花我的时间最长。不熟悉linux图形界面程序开发的基础概念
,熟的人也不多,网络上也缺少参考资料。连英文的资料都少,更何况中文的。
首先把wxWidgets的依赖添加到 Linker settings->link libraries。分别是libwx_gtk3u_core-3.0.a、libwx_baseu-3.0.a、libwx_baseu_net-3.0.a、libwx_baseu_xml-3.0.a。因为默认的程序用的都是基本的界面空间,就这几个就可以了。
解决编译错误
编译,操,一大堆错误。让人望而却步,windows这样一搞就直接编译通过了。因为windows没有这样的依赖关系wxWidgets->wxGTK+->GTK+->GTK->X11。
第一个错误,No Target! You should use wx-config program for compilation flags!。网上一搜,就一个结果。上面的方法根本就不解决问题。双击这个错误行,发现是代码通过预处理指令抛出来的。看看代码上下文,原来世需要定义一个常量,表示wxWidgets下层依赖的是什么。那就加上 __WXGTK__和__WXGTK3__;再编译,这个错误没有了。其他的都是各种找不到的错误。就是还需要添加依赖。
首先是GTK+3.0。在其他选项上再加上"pkg-config --libs gtk+-3.0",我操不行。搜啊搜啊,发现有人提到,gcc输入库的顺序要按依赖顺序排。查看编译时的命令行参数,"pkg-config --libs gtk+-3.0"执行出来的结果放在wxWidgets和wxGTK前面。没办法之后再控制台执行一下pkg-config --libs gtk+-3.0。把得到结果一个个手动添加到依赖。
然后是X11,X11幸好只要这一个项目。直接添加到依赖。再编译还有错误,undefined reference to symbol 'pthread_mutexattr_settype@@GLIBC_2.2.5'。这个在pthread里面,把libpthread添加到依赖。这些东西apt-get install build-essential的时候都有了,只要知道了名字,直接加入依赖就可以了。X11是linux下x windows环境图形界面程序都需要依赖的东西,要是用directfb就不用X11了。
接下来是各种编解码图像的找不到,先到wxWidgets下面找找有没有,有的话就加进去。没有的话就是用系统提供的。
还有undefined reference to symbol 'deflate'。上网搜这是zlib压缩和解压缩库里的东西。把libz加进入到依赖。
undefined reference to symbol 'dlclose@@GLIBC_2.2.5'。这玩意是加载动态连接库的dl库找不到。把dl加入到依赖。
最后就是这三个。
undefined reference to `SmcOpenConnection'
undefined reference to `SmcVendor'
undefined reference to `SmcCloseConnection'
到网上搜索,一个结果都没有。没办法直接看源码。看看从那个头文件导入的这些东西。然后是用头文件名和头文件给出的信息搜索一下。发现这个东西是X11用来管理会话的库中的。最后找到这个库的名字叫SM,加入依赖。
终于能够编译通过了。
开源的东西,都有这个特点,大家你贡献一点,我贡献一点。要想不重复发明轮子,就得从这找到,从那儿找需要的东西然后集合起来。
在ubuntu上使用wxWidgets成功开发一个图形界面程序的更多相关文章
- 2018-09-28 用Python3和tkinter开发简单图形界面程序
源码库: program-in-chinese/wubi_code_editor 起因在这里. 由于此项目和汉字相关, 个人也想尝试Python的图形界面开发, 于是开始尝试. 遇到的一个坑. 用户测 ...
- Delphi - 让Delphi10.2在Windows下开发的图形界面程序运行在64位Linux中!
FmxLinux官网:https://fmxlinux.com/ 参考: http://docwiki.embarcadero.com/RADStudio/Tokyo/en/Linux_Applica ...
- 从零开始在ubuntu上配置深度学习开发环境
从零开始在ubuntu上配置深度学习开发环境 昨天一不小心把原来配置好的台式机的开发环境破坏了,调了半天没有调回来,索性就重装一次ubuntu系统.这篇文章主要记录一个简单的.‘傻瓜式’教程. 一.U ...
- 如何用原生js开发一个Chrome扩展程序
原文地址:How to Build a Simple Chrome Extension in Vanilla JavaScript 开发一个Chrome扩展程序非常简单,只需要使用原生的js就可以完成 ...
- Android(java)学习笔记219:开发一个多界面的应用程序之两种意图
1.两种意图: (1)显式意图: 在代码里面用intent设置要开启Activity的字节码.class文件: (2)隐式意图: Android(java)学习笔记218:开发一个多界面的应用程序之人 ...
- 如何快速地开发一个微信小程序
如何快速地开发一个微信小程序呢?我觉得作为初学者,最好能有一个模板,然后改这个模板. 同样作为初学者,刚开始的时候我有下面的几个问题,后来通过问同学,我弄清楚了. 微信小程序可以连接MySQL或者Sq ...
- Android(java)学习笔记162:开发一个多界面的应用程序之两种意图
1.两种意图: (1)显式意图: 在代码里面用intent设置要开启Activity的字节码.class文件: (2)隐式意图: Android(java)学习笔记218:开发一个多界面的应用程序之人 ...
- 在桌面Linux环境下开发图形界面程序的方案对比
在Linux下开发GUI程序的方法有很多,比如Gnome桌面使用GTK+作为默认的图形界面库,KDE桌面使用Qt作为默认的图形界面库,wxWidgets则是另一个使用广泛的图形库,此外使用Java中的 ...
- 使用开源工具MonoDevelop开发GTK#图形界面
转自:http://developer.51cto.com/art/201011/235040.htm Mono一直到现在的2.8已经完全可以胜任一些比较小的项目了,但相关的开发文档与教程一直比较匮乏 ...
随机推荐
- feedback 是什么意思
feedback 是什么意思 能否不要说 feedback 呢? 加一个 feedback? 天啊 先解释一下 feedback 是什么 ? 还有 aria-describedby=&q ...
- java异常分类(运行时异常,可检查异常)
NullPointerException:是运行时异常(RuntimeException),也叫非检查异常 所以我们抛出该类异常实例时,方法声明处无需添加throws来列举该类异常的抛出,编译器在编译 ...
- [SQL]SQL删除数据的各种方式总结
SQL删除数据的各种方式总结 一.使用DELETE从表中删除目标行.记录每次删除操作.如: USE pubs DELETE FROM authors WHERE au_lname = 'McBadde ...
- C++primer 练习15.15
// 15_15.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" #include<iostream> #include< ...
- Android--Intent的使用
1.Activity之间的切换通过Intent来完成. 1)清单文件,配置好Activity,所有Activity都需要在该文件中配置. <?xml version="1.0" ...
- Spring Data Jpa 规范接口表
Keyword Sample JPQL snippet And findByLastnameAndFirstname … where x.lastname = ?1 and x.firstname ...
- (整理)RPC
今天研究了一下Webservice,然后就查到RPC,看到CSDN上有两篇很好的文章,就学习一下,并记录在此以便后续研究 http://blog.csdn.net/mindfloating/artic ...
- python3 内置函数 filter()
filter(function or None, iterable) --> filter object Return an iterator yielding those items of i ...
- php读取目录及子目录下所有文件名的方法
本文实例讲述了php读取目录及子目录下所有文件名的方法,分享给大家供大家参考.具体实现方法如下: 一般来说php中读取目录下的文件名的方式确实不少,最简单的是scandir,具体代码如下: $dir= ...
- PHP截取IE浏览器并缩小原图的方法
这篇文章主要介绍了PHP截取IE浏览器并缩小原图的方法,涉及PHP调用com组件实现图像截取的相关技巧,需要的朋友可以参考下 本文实例讲述了PHP截取IE浏览器并缩小原图的方法.分享给大家供大家参考, ...