从 wxWidgets 和 C++ 开始
Starting with wxWidgets and C++
我正在尝试了解 wxWidgets 的实际工作原理。我想在 OSX 10.11.1 上构建一个 C++ GUI 应用程序,只是为了学习 C++。
现在我从 https://www.wxwidgets.org/downloads/ 得到了 wxWidgets,我得到了 Linux/OSX 版本。
我提取了来源和 运行 ./configure && make && make install
正如我从这里的一个问题中看到的那样。
它似乎已经持续了一段时间然后我得到了这个:
`In file included from ./include/wx/variant.h:401:
./include/wx/any.h:611:5: warning: expression with side effects will be evaluated despite being used as an operand to 'typeid' [-Wpotentially-evaluated-expression]
WX_DECLARE_ANY_VALUE_TYPE(wxAnyValueTypeImplVariantData)
^
./include/wx/any.h:167:25: note: expanded from macro 'WX_DECLARE_ANY_VALUE_TYPE'
return wxTypeId(*sm_instance.get()) == wxTypeId(*otherType); \
^
./include/wx/typeinfo.h:84:47: note: expanded from macro 'wxTypeId'
#define wxTypeId(OBJ) wxTypeIdentifier(typeid(OBJ).name())
^
./src/osx/webview_webkit.mm:381:37: warning: incompatible pointer types sending 'WebViewLoadDelegate *' to parameter of type 'id<WebFrameLoadDelegate>' [-Wincompatible-pointer-types]
[m_webView setFrameLoadDelegate:loadDelegate];
^~~~~~~~~~~~
./src/osx/webview_webkit.mm:387:34: warning: incompatible pointer types sending 'WebViewPolicyDelegate *' to parameter of type 'id<WebPolicyDelegate>' [-Wincompatible-pointer-types]
[m_webView setPolicyDelegate:policyDelegate];
^~~~~~~~~~~~~~
./src/osx/webview_webkit.mm:392:30: warning: incompatible pointer types sending 'WebViewUIDelegate *' to parameter of type 'id<WKUIDelegate> _Nullable' [-Wincompatible-pointer-types]
[m_webView setUIDelegate:uiDelegate];
^~~~~~~~~~
./src/osx/webview_webkit.mm:464:34: warning: 'WKPreferences' may not respond to 'setUsesPageCache:'
[[m_webView preferences] setUsesPageCache:NO];
~~~~~~~~~~~~~~~~~~~~~~~ ^
./src/osx/webview_webkit.mm:466:34: warning: 'WKPreferences' may not respond to 'setUsesPageCache:'
[[m_webView preferences] setUsesPageCache:YES];
~~~~~~~~~~~~~~~~~~~~~~~ ^
./src/osx/webview_webkit.mm:936:25: error: cannot initialize a variable of type 'WebBackForwardList *' with an rvalue of type 'WKBackForwardList *'
WebBackForwardList* history = [m_webView backForwardList];
^ ~~~~~~~~~~~~~~~~~~~~~~~~~~~
./src/osx/webview_webkit.mm:954:25: error: cannot initialize a variable of type 'WebBackForwardList *' with an rvalue of type 'WKBackForwardList *'
WebBackForwardList* history = [m_webView backForwardList];
^ ~~~~~~~~~~~~~~~~~~~~~~~~~~~
15 warnings and 2 errors generated.
make: *** [webviewdll_osx_webview_webkit.o] Error 1`
失败了。
我不知道如何解决它。
我可以使用更简单的替代方法吗?
还有一个问题我好像没有得到:
1 - 它说它是 cross 平台。我想通过这样说会有 1 个源文件夹,在每个平台上编译不同,并且没有每个平台的源代码。
2 - 另外,它安装在哪里?它会成为我的 os 库的一部分吗?我可以在我编写的任何 C++ 程序中使用它吗?
3 - 我怎样才能将我的程序移动到另一台 OSX 机器上?我是否必须构建一个独立的应用程序(如 Java),或者该机器是否需要与开发该程序的机器具有相同的 wxWidgets 版本?
那里有很多问题,最好逐一提问,但让我尝试简要地解决所有问题。
您看到的问题是由于自上次 wxWidgets 发布以来 OS X SDK 中的不兼容更改,如果您搜索 wxTrac 并找到 this bug,您可能已经发现了这一点。你也可以在那里看到,它已经修复了很长一段时间,所以你需要做的就是从 GitHub 获取最新版本。或者,您可以使用旧版 SDK 进行构建,但不推荐这样做。
下一个:
- 它是跨平台的,因为你可以编写一个版本的代码,在多个平台上编译和工作。完全避免平台相关的代码显然是不可能的,wxWidgets只是给你封装好了,让你不用写。
- 默认情况下,它作为任何 Unix 库安装在
/usr/local
下,但可以在 运行 配置时使用 --prefix
选项进行更改。
- 您应该在您的程序中包含 wxWidgets 库。最简单的方法是静态地 link 给他们。稍微复杂一点的是将共享库放入您的应用程序包中。
我正在尝试了解 wxWidgets 的实际工作原理。我想在 OSX 10.11.1 上构建一个 C++ GUI 应用程序,只是为了学习 C++。
现在我从 https://www.wxwidgets.org/downloads/ 得到了 wxWidgets,我得到了 Linux/OSX 版本。
我提取了来源和 运行 ./configure && make && make install
正如我从这里的一个问题中看到的那样。
它似乎已经持续了一段时间然后我得到了这个:
`In file included from ./include/wx/variant.h:401:
./include/wx/any.h:611:5: warning: expression with side effects will be evaluated despite being used as an operand to 'typeid' [-Wpotentially-evaluated-expression]
WX_DECLARE_ANY_VALUE_TYPE(wxAnyValueTypeImplVariantData)
^
./include/wx/any.h:167:25: note: expanded from macro 'WX_DECLARE_ANY_VALUE_TYPE'
return wxTypeId(*sm_instance.get()) == wxTypeId(*otherType); \
^
./include/wx/typeinfo.h:84:47: note: expanded from macro 'wxTypeId'
#define wxTypeId(OBJ) wxTypeIdentifier(typeid(OBJ).name())
^
./src/osx/webview_webkit.mm:381:37: warning: incompatible pointer types sending 'WebViewLoadDelegate *' to parameter of type 'id<WebFrameLoadDelegate>' [-Wincompatible-pointer-types]
[m_webView setFrameLoadDelegate:loadDelegate];
^~~~~~~~~~~~
./src/osx/webview_webkit.mm:387:34: warning: incompatible pointer types sending 'WebViewPolicyDelegate *' to parameter of type 'id<WebPolicyDelegate>' [-Wincompatible-pointer-types]
[m_webView setPolicyDelegate:policyDelegate];
^~~~~~~~~~~~~~
./src/osx/webview_webkit.mm:392:30: warning: incompatible pointer types sending 'WebViewUIDelegate *' to parameter of type 'id<WKUIDelegate> _Nullable' [-Wincompatible-pointer-types]
[m_webView setUIDelegate:uiDelegate];
^~~~~~~~~~
./src/osx/webview_webkit.mm:464:34: warning: 'WKPreferences' may not respond to 'setUsesPageCache:'
[[m_webView preferences] setUsesPageCache:NO];
~~~~~~~~~~~~~~~~~~~~~~~ ^
./src/osx/webview_webkit.mm:466:34: warning: 'WKPreferences' may not respond to 'setUsesPageCache:'
[[m_webView preferences] setUsesPageCache:YES];
~~~~~~~~~~~~~~~~~~~~~~~ ^
./src/osx/webview_webkit.mm:936:25: error: cannot initialize a variable of type 'WebBackForwardList *' with an rvalue of type 'WKBackForwardList *'
WebBackForwardList* history = [m_webView backForwardList];
^ ~~~~~~~~~~~~~~~~~~~~~~~~~~~
./src/osx/webview_webkit.mm:954:25: error: cannot initialize a variable of type 'WebBackForwardList *' with an rvalue of type 'WKBackForwardList *'
WebBackForwardList* history = [m_webView backForwardList];
^ ~~~~~~~~~~~~~~~~~~~~~~~~~~~
15 warnings and 2 errors generated.
make: *** [webviewdll_osx_webview_webkit.o] Error 1`
失败了。
我不知道如何解决它。
我可以使用更简单的替代方法吗?
还有一个问题我好像没有得到:
1 - 它说它是 cross 平台。我想通过这样说会有 1 个源文件夹,在每个平台上编译不同,并且没有每个平台的源代码。
2 - 另外,它安装在哪里?它会成为我的 os 库的一部分吗?我可以在我编写的任何 C++ 程序中使用它吗?
3 - 我怎样才能将我的程序移动到另一台 OSX 机器上?我是否必须构建一个独立的应用程序(如 Java),或者该机器是否需要与开发该程序的机器具有相同的 wxWidgets 版本?
那里有很多问题,最好逐一提问,但让我尝试简要地解决所有问题。
您看到的问题是由于自上次 wxWidgets 发布以来 OS X SDK 中的不兼容更改,如果您搜索 wxTrac 并找到 this bug,您可能已经发现了这一点。你也可以在那里看到,它已经修复了很长一段时间,所以你需要做的就是从 GitHub 获取最新版本。或者,您可以使用旧版 SDK 进行构建,但不推荐这样做。
下一个:
- 它是跨平台的,因为你可以编写一个版本的代码,在多个平台上编译和工作。完全避免平台相关的代码显然是不可能的,wxWidgets只是给你封装好了,让你不用写。
- 默认情况下,它作为任何 Unix 库安装在
/usr/local
下,但可以在 运行 配置时使用--prefix
选项进行更改。 - 您应该在您的程序中包含 wxWidgets 库。最简单的方法是静态地 link 给他们。稍微复杂一点的是将共享库放入您的应用程序包中。