1. 說明
libsigc++是一個C++ callback framework Library

本文介紹如何使用libsigc++

 

2. 什麼是libsigc++

2.1 官網的介紹

http://libsigc.sourceforge.net/



2.2 下載網址

http://ftp.gnome.org/pub/GNOME/sources/libsigc++/

目前筆者撰寫本文時, libsigc++最新版本是2.4.0, 就以2.4.0為基礎來做介紹

下載方式如下
wget http://ftp.gnome.org/pub/GNOME/sources/libsigc++/2.4/libsigc++-2.4.0.tar.xz

3. 編譯

3.1 libsigc++ x86 on Ubuntu

Step1:

wget http://ftp.gnome.org/pub/GNOME/sources/libsigc++/2.4/libsigc++-2.4.0.tar.xz

Step2:

tar xJvf libsigc++-2.4.0.tar.xz

Step3:

cd libsigc++-2.4.0/
./configure --prefix=$PWD/out
make
make install

Step4

當執行make install後, 會將libsigc++2.4.0安裝在out的目錄下面
$ libsigc++-2.4.0$ tree out/ -L 2
out/
├── include
│   └── sigc++-2.0
├── lib
│   ├── libsigc-2.0.la
│   ├── libsigc-2.0.so -> libsigc-2.0.so.0.0.0
│   ├── libsigc-2.0.so.0 -> libsigc-2.0.so.0.0.0
│   ├── libsigc-2.0.so.0.0.0
│   ├── pkgconfig
│   └── sigc++-2.0
└── share
    ├── devhelp
    └── doc

有header檔案, 也有lib檔案, 就可以開始使用libsigc++

 

3.2 libsigc++ arm cross compile

ARM Toolchain可以到官網下載 https://releases.linaro.org/

舉個例子如下
wget  https://releases.linaro.org/14.09/components/toolchain/binaries/gcc-linaro-arm-linux-gnueabihf-4.9-2014.09_linux.tar.xz

Step1:

wget http://ftp.gnome.org/pub/GNOME/sources/libsigc++/2.4/libsigc++-2.4.0.tar.xz

Step2:

tar xJvf libsigc++-2.4.0.tar.xz

Step3:

./configure --host=arm-linux-gnueabihf --prefix=$PWD/out
make
make install

Step4:

當執行make install後, 會將libsigc++2.4.0安裝在out的目錄下面

$ libsigc++-2.4.0$ tree out/ -L 2
out/
├── include
│   └── sigc++-2.0
├── lib
│   ├── libsigc-2.0.la
│   ├── libsigc-2.0.so -> libsigc-2.0.so.0.0.0
│   ├── libsigc-2.0.so.0 -> libsigc-2.0.so.0.0.0
│   ├── libsigc-2.0.so.0.0.0
│   ├── pkgconfig
│   └── sigc++-2.0
└── share
    ├── devhelp
    └── doc

可以利用file指令, 檢查一下libsigc-2.0.so.0.0.0, 確認是ARM Toolchain編出來的library

$ libsigc++-2.4.0/out/lib> file libsigc-2.0.so.0.0.0
libsigc-2.0.so.0.0.0: ELF 32-bit LSB shared object, ARM, EABI5 version 1 (SYSV), dynamically linked, BuildID[sha1]=f4c5a29e207445b20c94574825c72eb3615fb0d6, not stripped

4. libsigc++ programming
4.1 examples

libsigc++-2.4.0.tar.xz解開後, 在examples裡面己經有提供二支reference code

examples/
├── hello_world.cc
└── member_method.cc

4.2 hello_world.cc

examples/hello_world.cc的source code如下

File Name: examples/hello_world.cc

/* Copyright 2003, The libsigc++ Development Team
 *
 *  Assigned to the public domain.  Use as you wish without
 *  restriction.
 */

#include <iostream>
#include <string>

#include <sigc++/sigc++.h>

SIGC_USING_STD(cout)
SIGC_USING_STD(endl)
SIGC_USING_STD(string)

void on_print(const std::string& str)
{
  std::cout << str;
}

int main()
{
  sigc::signal<void, const std::string&> signal_print;
 
  signal_print.connect( sigc::ptr_fun(&on_print) );
 
  signal_print.emit("hello world\n");

  return 0;
}

前面章節己經編出libsigc++ header和lib
也就是己經有了libsigc++ SDK, 如何利用這個SDK來編譯 hello_world.cc

Step1: 將hello_world.cc拷貝到out目錄下

$ tree out/ -L 2
out/
├── hello_world.cc
├── include
│   └── sigc++-2.0
├── lib
│   ├── libsigc-2.0.la
│   ├── libsigc-2.0.so -> libsigc-2.0.so.0.0.0
│   ├── libsigc-2.0.so.0 -> libsigc-2.0.so.0.0.0
│   ├── libsigc-2.0.so.0.0.0
│   ├── pkgconfig
│   └── sigc++-2.0
└── share
    ├── devhelp
    └── doc

Step2: 利用gcc編譯

利用下面的指令編譯
g++ -o hello_world hello_world.cc -I./include/sigc++-2.0 -I./lib/sigc++-2.0/include -L./lib -lsigc-2.0

執行完上面指令, 就會產生一支hello_world的執行檔案

如果想利用make來編譯的話, 可以利用下面的makefile

File Name: makefile

CROSS_COMPILE ?=

NAME = hello_world

INC_DIRS = -I./include/sigc++-2.0 -I./lib/sigc++-2.0/include

LIB_DIRS = -L./lib
LIBS = -lsigc-2.0

SUB_DIRS =

#--[common]--------------------------------
CXX = ${CROSS_COMPILE}g++
CC = ${CROSS_COMPILE}gcc
AR = ${CROSS_COMPILE}ar
RM = rm

LD = ${CXX}

CFLAGS = ${INC_DIRS}
CXXFLAGS = ${INC_DIRS}

LDFLAGS = ${LIB_DIRS} ${LIBS}

SRCS_C = $(wildcard *.c)
SRCS_CC = $(wildcard *.cc)
SRCS_CPP = $(wildcard *.cpp)
SRCS = ${SRCS_C} ${SRCS_CPP} ${SRCS_CC}

OBJS = ${SRCS_C:.c=.o} ${SRCS_CPP:.cpp=.o} ${SRCS_CC:.cc=.o}

.PHONY: all ${SUB_DIRS} clean

all: ${SUB_DIRS} ${NAME}

${NAME} : ${OBJS}
    ${LD} -o $@ ${OBJS} ${LDFLAGS}

${SUB_DIRS}:
    ${MAKE} -C $@

clean:
    -${RM} -f ${NAME} ${OBJS}

.SUFFIXES:

.SUFFIXES: .o .c .cpp .cc

.c.o:
    ${CC} ${CFLAGS} -c $< -o $(patsubst %.c,%.o,$<)

.cc.o:
    ${CXX} ${CXXFLAGS} -c $< -o $(patsubst %.cc,%.o,$<)

.cpp.o:
    ${CXX} ${CXXFLAGS} -c $< -o $(patsubst %.cpp,%.o,$<)

然後再執行下面的指令, 就可以編出hello_word執行檔案
$ make

Step3: 執行hello_world

$ ./hello_world
hello world

 

4.3 member_method.cc

example/member_method.cc的source code如下

File Name: example/member_method.cc

/* Copyright 2003, The libsigc++ Development Team
 *
 *  Assigned to the public domain.  Use as you wish without
 *  restriction.
 */

#include <iostream>
#include <string>

#include <sigc++/sigc++.h>

SIGC_USING_STD(cout)
SIGC_USING_STD(endl)
SIGC_USING_STD(string)

class Something : public sigc::trackable
{
public:
  Something();

protected:

  virtual void on_print(int a);
 
  typedef sigc::signal<void, int> type_signal_print;
  type_signal_print signal_print;
    
};

Something::Something()
{
  type_signal_print::iterator iter = signal_print.connect( sigc::mem_fun(this, &Something::on_print) );

  signal_print.emit(2);

  //This isn't necessary - it's just to demonstrate how to disconnect:
  iter->disconnect();
  signal_print.emit(3); //Prove that it is no longer connected.
}

void Something::on_print(int a)
{
  std::cout << "on_print recieved: " << a << std::endl;
}

int main()
{
  Something something;  
  return 0;
}

怎麼編譯member_method.cc

Step1: 將examples/member_method.cc拷貝到out的目錄下面

$ tree out/ -L 2
out/
├── hello_world.cc
├── include
│   └── sigc++-2.0
├── lib
│   ├── libsigc-2.0.la
│   ├── libsigc-2.0.so -> libsigc-2.0.so.0.0.0
│   ├── libsigc-2.0.so.0 -> libsigc-2.0.so.0.0.0
│   ├── libsigc-2.0.so.0.0.0
│   ├── pkgconfig
│   └── sigc++-2.0
├── makefile
├── member_method.cc
└── share
    ├── devhelp
    └── doc

可以看到out的目錄下面多一個member_method.cc的檔案

Step2: makefile

File Name: makefile

CROSS_COMPILE ?=

NAME = member_method

INC_DIRS = -I./include/sigc++-2.0 -I./lib/sigc++-2.0/include

LIB_DIRS = -L./lib
LIBS = -lsigc-2.0

SUB_DIRS =

#--[common]--------------------------------
CXX = ${CROSS_COMPILE}g++
CC = ${CROSS_COMPILE}gcc
AR = ${CROSS_COMPILE}ar
RM = rm

LD = ${CXX}

CFLAGS = ${INC_DIRS}
CXXFLAGS = ${INC_DIRS}

LDFLAGS = ${LIB_DIRS} ${LIBS}

SRCS_C =
SRCS_CC = member_method.cc
SRCS_CPP =
SRCS = ${SRCS_C} ${SRCS_CPP} ${SRCS_CC}

OBJS = ${SRCS_C:.c=.o} ${SRCS_CPP:.cpp=.o} ${SRCS_CC:.cc=.o}

.PHONY: all ${SUB_DIRS} clean

all: ${SUB_DIRS} ${NAME}

${NAME} : ${OBJS}
    ${LD} -o $@ ${OBJS} ${LDFLAGS}

${SUB_DIRS}:
    ${MAKE} -C $@

clean:
    -${RM} -f ${NAME} ${OBJS}

.SUFFIXES:

.SUFFIXES: .o .c .cpp .cc

.c.o:
    ${CC} ${CFLAGS} -c $< -o $(patsubst %.c,%.o,$<)

.cc.o:
    ${CXX} ${CXXFLAGS} -c $< -o $(patsubst %.cc,%.o,$<)

.cpp.o:
    ${CXX} ${CXXFLAGS} -c $< -o $(patsubst %.cpp,%.o,$<)

Step3: 執行make

$ make
執行make就會編出一支member_method檔案

Step4:執行member_method

$ ./member_method
on_print recieved: 2

 

 

 

 

arrow
arrow
    文章標籤
    libsigc++ sigc++ c++
    全站熱搜
    創作者介紹
    創作者 shangenpoden 的頭像
    shangenpoden

    玄根白丁的部落格

    shangenpoden 發表在 痞客邦 留言(0) 人氣()