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