1. 程式人生 > >在Mac下配置wxWidgets環境

在Mac下配置wxWidgets環境

下載原始碼

到官網下載相關原始碼

安裝編譯環境

為了編譯wxWidgets,需要安裝GTK(wxWidgets依賴)、cmake

安裝GTK

1、安裝Command Line Tool:xcode-select–install
(如果安裝過Xcode,可以忽略這一步)
2、安裝Homebrew
使用Ruby指令碼安裝,Mac自帶Ruby,因此直接執行指令:

ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"

3、安裝pkg-config
pkg-config是姨哥提供從原始碼中編譯軟體時查詢已安裝的庫使用的統一介面工具。
因為安裝好了Homebrew,直接使用Homebrew安裝,執行指令:

brew install pkg-config 

4、安裝GTK+3.0,執行指令:

brew install gtk+3

5、配置pkg-config

vim ~/.bash_profile

在檔案中加入以下程式碼,不同環境下路徑會有些許不同,注意修改:

export PKG_CONFIG_PATH="/usr/X11/lib/pkgconfig:/usr/local/Cellar/cairo/1.12.16/lib/pkgconfig/"

儲存退出後:

source ~/.bash_profile

測試程式碼:

#include <stdio.h>
#include <stdlib.h>
#include <gtk/gtk.h> static gboolean delete_event(GtkWidget * widget, GdkEvent * event, gpointer data) { gtk_main_quit(); return FALSE; } int main(int argc, char *argv[]) { GtkWidget *window; GtkWidget *label; gtk_init(&argc, &argv); window = gtk_window_new(GTK_WINDOW_TOPLEVEL); gtk_window_set_position(GTK_WINDOW(window
), GTK_WIN_POS_CENTER); gtk_window_set_title(GTK_WINDOW(window), "RobberPhex"); gtk_window_set_default_size(GTK_WINDOW(window), 400, 300); g_signal_connect(window, "delete-event", G_CALLBACK(delete_event), NULL); gtk_container_set_border_width(GTK_CONTAINER(window), 10); label = gtk_label_new("Hello GTK!"); gtk_container_add(GTK_CONTAINER(window), label); gtk_widget_show(label); gtk_widget_show(window); gtk_main(); return 0; }

執行指令:

gcc $(pkg-config gtk+-3.0 --cflags) $(pkg-config gtk+-3.0 --libs) gtk_test.c -o gtktest

安裝cmake

因為已經安裝了Homebrew,直接執行指令:

brew install cmake

編譯wxWidgets

  • 到官網下載壓縮包,解壓,進入資料夾
  • 建立一個目錄,用來存放編譯時生成的檔案
$ mkdir wx_build
$ cd wx_build/
  • 配置
$ ../configure --disable-shared --enable-unicode

“-disable-shared”指定構建靜態庫

  • 編譯&安裝
$ make
$ make install
  • 編譯例子程式(還是在wx_build資料夾)
$ cd samples/
$ make
$ cd animate/
$ make
$ ./anitest
  • 第一個wxWidgets程式:
    main.cpp:
#include <wx/wx.h>
#include "simple.h"

class Hello : public wxFrame
{
public:
    Hello(const wxString& title)
            : wxFrame(NULL, wxID_ANY, title, wxDefaultPosition, wxSize(250, 150))
    {
        Centre();
    }
};

class MyApp : public wxApp
{
public:
    bool OnInit()
    {
        Simple *simple = new Simple(wxT("Hello"));
        simple->Show(true);
        return true;
    }
};

wxIMPLEMENT_APP(MyApp);

simple.cpp:

#include "simple.h"

Simple::Simple(const wxString& title)
        : wxFrame(NULL, wxID_ANY, title, wxDefaultPosition, wxSize(250, 150))
{
    Centre();
}

simple.h:

#ifndef WXWIDGETS_TEST2_SIMPLE_H
#define WXWIDGETS_TEST2_SIMPLE_H

#include "wx/wx.h"

class Simple : public wxFrame
{
public:
Simple(const wxString& title);

};

#endif //WXWIDGETS_TEST2_SIMPLE_H

CMakeList.txt:

cmake_minimum_required(VERSION 3.9)
project(wxWidgets_test2)

set(CMAKE_CXX_STANDARD 11)
set(SOURCE_FILES main.cpp simple.cpp simple.h)

add_executable(wxWidgets_test2 ${SOURCE_FILES})

file(GLOB wxWidgets_LIBRARTIES "/Users/cmzhang/Documents/wxWidgets-3.1.1/wx_build")

find_package(wxWidgets REQUIRED COMPONENTS net core base)
include(${wxWidgets_USE_FILE})
target_link_libraries(wxWidgets_test2 ${wxWidgets_LIBRARIES})

P.S. 使用cmake編譯wxWidgets程式,需要在CMakeLists.txt檔案中加入以下三句話:

find_package(wxWidgets REQUIRED COMPONENTS net core base)
include(${wxWidgets_USE_FILE})
target_link_libraries(wxWidgets_test2 ${wxWidgets_LIBRARIES})

編譯時可能會出現錯誤:’tr1/type_traits’ file not found,其原因是因為Mac OS X 10.9以後clang使用libc++庫而不是libstdc++庫,libc++庫提供c++11庫,而libstdc++提供c++03庫支援tr1

解決方法:使用libstd++庫編輯build目錄下cmake生成的CMakeCache.txt檔案,這個檔案是cmake重要引數,修改其中的CMAKE_CXX_FLAGS:STRING=為CMAKE_CXX_FLAGS:STRING=-stdlib=libstdc++

參考部落格