botbrew下写glib2程序





作者

He YiJun – storysnail<at>hotmail.com

   

版权

转载请保留本声明!


本文档包含的原创代码根据General Public License,v3 发布
GPLv3
许可证的副本可以在这里获得:http://www.gnu.org/licenses/gpl.html

本文档根据GNU Free Documentation License 1.3发布
GFDL1.3
许可证的副本可以在这里获得:http://www.gnu.org/licenses/gfdl.html

文中所引用的软件版权详见各软件版权具体声明,文中所提及的所有商标均为各自商标所有人的财产。
作者在此向所有提供过帮助和支持的朋友表示感谢!

更新

2014-11-10

本文已经停止更新

   






前言:

...

一:配置botbrew中的glib2函数库

1:
启动botbrew后,在其主界面选择安装libglib2.0libglib2.0-binlibglib2.0-devlibglib2.0-doc


2:
安装好所需软件后,将下面的内容保存成glibconfig.h文件,进入终端模拟器,输入su,取得root权限,然后输入

   cp glibconfig.h /botbrew/include/glib-2.0/
/**************************************************************************************************
* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ *
                               glibconfig.h
                    This file just for botbrew's glib2.
    Develop Team     :    ls
    Main Programmer  :    He YiJun  (storysnail<at>gmail.com)
    License          :    GPL2
    Last Update      :    2013-06-15
* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ *
**************************************************************************************************/
#ifndef __G_LIBCONFIG_H__
#define __G_LIBCONFIG_H__ 

#include <glib/gmacros.h>
#include <limits.h>
#include <float.h>
#define GLIB_HAVE_ALLOCA_H
#define GLIB_HAVE_SYS_POLL_H 

/* Specifies that GLib's g_print*() functions wrap the
 * system printf functions.  This is useful to know, for example,
 * when using glibc's register_printf_function().
 */
#define GLIB_USING_SYSTEM_PRINTF 

G_BEGIN_DECLS 

#define G_MINFLOAT    FLT_MIN
#define G_MAXFLOAT    FLT_MAX
#define G_MINDOUBLE    DBL_MIN
#define G_MAXDOUBLE    DBL_MAX
#define G_MINSHORT    SHRT_MIN
#define G_MAXSHORT    SHRT_MAX
#define G_MAXUSHORT    USHRT_MAX
#define G_MININT    INT_MIN
#define G_MAXINT    INT_MAX
#define G_MAXUINT    UINT_MAX
#define G_MINLONG    LONG_MIN
#define G_MAXLONG    LONG_MAX
#define G_MAXULONG    ULONG_MAX 

typedef signed char gint8;
typedef unsigned char guint8;
typedef signed short gint16;
typedef unsigned short guint16;
#define G_GINT16_MODIFIER "h"
#define G_GINT16_FORMAT "hi"
#define G_GUINT16_FORMAT "hu"
typedef signed int gint32;
typedef unsigned int guint32;
#define G_GINT32_MODIFIER ""
#define G_GINT32_FORMAT "i"
#define G_GUINT32_FORMAT "u"
#define G_HAVE_GINT64 1          /*deprecated, always true */ 

G_GNUC_EXTENSION typedef signed long long gint64;
G_GNUC_EXTENSION typedef unsigned long long guint64; 

#define G_GINT64_CONSTANT(val)    (G_GNUC_EXTENSION (val##LL))
#define G_GUINT64_CONSTANT(val)    (G_GNUC_EXTENSION (val##ULL))
#define G_GINT64_MODIFIER "ll"
#define G_GINT64_FORMAT "lli"
#define G_GUINT64_FORMAT "llu" 

#define GLIB_SIZEOF_VOID_P 4
#define GLIB_SIZEOF_LONG   4
#define GLIB_SIZEOF_SIZE_T 4 

typedef signed int gssize;
typedef unsigned int gsize;
#define G_GSIZE_MODIFIER ""
#define G_GSSIZE_FORMAT "i"
#define G_GSIZE_FORMAT "u" 

#define G_MAXSIZE    G_MAXUINT
#define G_MINSSIZE    G_MININT
#define G_MAXSSIZE    G_MAXINT 

typedef gint64 goffset;
#define G_MINOFFSET    G_MININT64
#define G_MAXOFFSET    G_MAXINT64 

#define G_GOFFSET_MODIFIER      G_GINT64_MODIFIER
#define G_GOFFSET_FORMAT        G_GINT64_FORMAT
#define G_GOFFSET_CONSTANT(val) G_GINT64_CONSTANT(val) 

#define GPOINTER_TO_INT(p)    ((gint)   (p))
#define GPOINTER_TO_UINT(p)    ((guint)  (p)) 

#define GINT_TO_POINTER(i)    ((gpointer)  (i))
#define GUINT_TO_POINTER(u)    ((gpointer)  (u)) 

typedef signed int gintptr;
typedef unsigned int guintptr; 

#define G_GINTPTR_MODIFIER      ""
#define G_GINTPTR_FORMAT        "i"
#define G_GUINTPTR_FORMAT       "u" 

#ifdef NeXT /*@#%@! NeXTStep */
# define g_ATEXIT(proc)    (!atexit (proc))
#else
# define g_ATEXIT(proc)    (atexit (proc))
#endif 

#define g_memmove(dest,src,len) G_STMT_START { memmove ((dest), (src), (len)); } G_STMT_END 

#define GLIB_MAJOR_VERSION 2
#define GLIB_MINOR_VERSION 24
#define GLIB_MICRO_VERSION 2 

#define G_OS_UNIX 

#define G_VA_COPY    va_copy 

#ifdef    __cplusplus
#define    G_HAVE_INLINE    1
#else    /*!__cplusplus */
#define G_HAVE_INLINE 1
#define G_HAVE___INLINE 1
#define G_HAVE___INLINE__ 1
#endif    /*!__cplusplus */ 

#ifdef    __cplusplus
#define G_CAN_INLINE    1
#else    /*!__cplusplus */
#define G_CAN_INLINE    1
#endif 

#ifndef __cplusplus
# define G_HAVE_ISO_VARARGS 1
#endif
#ifdef __cplusplus
# define G_HAVE_ISO_VARARGS 1
#endif 

/* gcc-2.95.x supports both gnu style and ISO varargs, but if -ansi
 * is passed ISO vararg support is turned off, and there is no work
 * around to turn it on, so we unconditionally turn it off.
 */
#if __GNUC__ == 2 && __GNUC_MINOR__ == 95
#  undef G_HAVE_ISO_VARARGS
#endif 

#define G_HAVE_GNUC_VARARGS 1
#define G_HAVE_GROWING_STACK 0 

#define G_HAVE_GNUC_VISIBILITY 1
#if defined(__SUNPRO_C) && (__SUNPRO_C >= 0x590)
#define G_GNUC_INTERNAL __attribute__((visibility("hidden")))
#elif defined(__SUNPRO_C) && (__SUNPRO_C >= 0x550)
#define G_GNUC_INTERNAL __hidden
#elif defined (__GNUC__) && defined (G_HAVE_GNUC_VISIBILITY)
#define G_GNUC_INTERNAL __attribute__((visibility("hidden")))
#else
#define G_GNUC_INTERNAL
#endif 

#define G_THREADS_ENABLED
#define G_THREADS_IMPL_POSIX
typedef struct _GStaticMutex GStaticMutex;
struct _GStaticMutex
{
  struct _GMutex *runtime_mutex;
  union {
    char   pad[24];
    double dummy_double;
    void  *dummy_pointer;
    long   dummy_long;
  } static_mutex;
};
#define    G_STATIC_MUTEX_INIT    { NULL, { { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0} } }
#define    g_static_mutex_get_mutex(mutex) 
  (g_thread_use_default_impl ? ((GMutex*)(gpointer) ((mutex)->static_mutex.pad)) : 
   g_static_mutex_get_mutex_impl_shortcut (&((mutex)->runtime_mutex)))
/* This represents a system thread as used by the implementation. An
 * alien implementaion, as loaded by g_thread_init can only count on
 * "sizeof (gpointer)" bytes to store their info. We however need more
 * for some of our native implementations. */
typedef union _GSystemThread GSystemThread;
union _GSystemThread
{
  char   data[4];
  double dummy_double;
  void  *dummy_pointer;
  long   dummy_long;
}; 

#define G_ATOMIC_OP_MEMORY_BARRIER_NEEDED 1 

#define GINT16_TO_LE(val)    ((gint16) (val))
#define GUINT16_TO_LE(val)    ((guint16) (val))
#define GINT16_TO_BE(val)    ((gint16) GUINT16_SWAP_LE_BE (val))
#define GUINT16_TO_BE(val)    (GUINT16_SWAP_LE_BE (val))
#define GINT32_TO_LE(val)    ((gint32) (val))
#define GUINT32_TO_LE(val)    ((guint32) (val))
#define GINT32_TO_BE(val)    ((gint32) GUINT32_SWAP_LE_BE (val))
#define GUINT32_TO_BE(val)    (GUINT32_SWAP_LE_BE (val))
#define GINT64_TO_LE(val)    ((gint64) (val))
#define GUINT64_TO_LE(val)    ((guint64) (val))
#define GINT64_TO_BE(val)    ((gint64) GUINT64_SWAP_LE_BE (val))
#define GUINT64_TO_BE(val)    (GUINT64_SWAP_LE_BE (val))
#define GLONG_TO_LE(val)    ((glong) GINT32_TO_LE (val))
#define GULONG_TO_LE(val)    ((gulong) GUINT32_TO_LE (val))
#define GLONG_TO_BE(val)    ((glong) GINT32_TO_BE (val))
#define GULONG_TO_BE(val)    ((gulong) GUINT32_TO_BE (val))
#define GINT_TO_LE(val)        ((gint) GINT32_TO_LE (val))
#define GUINT_TO_LE(val)    ((guint) GUINT32_TO_LE (val))
#define GINT_TO_BE(val)        ((gint) GINT32_TO_BE (val))
#define GUINT_TO_BE(val)    ((guint) GUINT32_TO_BE (val))
#define GSIZE_TO_LE(val)    ((gsize) GUINT32_TO_LE (val))
#define GSSIZE_TO_LE(val)    ((gssize) GINT32_TO_LE (val))
#define GSIZE_TO_BE(val)    ((gsize) GUINT32_TO_BE (val))
#define GSSIZE_TO_BE(val)    ((gssize) GINT32_TO_BE (val))
#define G_BYTE_ORDER G_LITTLE_ENDIAN 

#define GLIB_SYSDEF_POLLIN =1
#define GLIB_SYSDEF_POLLOUT =4
#define GLIB_SYSDEF_POLLPRI =2
#define GLIB_SYSDEF_POLLHUP =16
#define GLIB_SYSDEF_POLLERR =8
#define GLIB_SYSDEF_POLLNVAL =32 

#define G_MODULE_SUFFIX "so" 

/* A GPid is an abstraction for a process "handle". It is *not* an
 * abstraction for a process identifier in general. GPid is used in
 * GLib only for descendant processes spawned with the g_spawn*
 * functions. On POSIX there is no "process handle" concept as such,
 * but on Windows a GPid is a handle to a process, a kind of pointer,
 * not a process identifier.
 */
typedef int GPid; 

#define GLIB_SYSDEF_AF_UNIX 1
#define GLIB_SYSDEF_AF_INET 2
#define GLIB_SYSDEF_AF_INET6 10 

#define GLIB_SYSDEF_MSG_OOB 1
#define GLIB_SYSDEF_MSG_PEEK 2
#define GLIB_SYSDEF_MSG_DONTROUTE 4 

G_END_DECLS 

#endif /*GLIBCONFIG_H */ 





二 编译运行glib2程序

关于glib2的程序在互联网上有很多,有一些显然已经过时了,但我在botbrew中编译时也依然可以通过,只是多了些该函数库已经过时的警告,下面给出一个简单的程序和makefile实例,搞程序的人还是用代码说话更直接。

/**************************************************************************************************
* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ *
                               gtest.c 

    Develop Team     :    ls
    Main Programmer  :    He YiJun  (storysnail<at>gmail.com)
    License          :    GPLv3
    Last Update      :    2013-03-03
* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ *
**************************************************************************************************/
#include <glib.h> 
int main(int argc, char *argv[]) 
{ 
  GRand *rand; GTimer *timer;
  gint n; 
  gint i, j; 
  gulong x = 0; 
  //创建随机数对象后产生随机数并显示出来,之后释放随机数对象 
  rand = g_rand_new(); 
  for(n=0; n<20; n++) { 
    g_print("%d	",g_rand_int_range(rand,1,100)); 
  } 
  g_rand_free(rand); 
  g_print("
"); 
  //创建计时器,之后让机器忙等待,然后输出计时结果 
  timer = g_timer_new(); 
  g_timer_start(timer); 

  for(i=0; i<10000; i++) 
    for(j=0; j<3650; j++) 
      x++;
  g_timer_stop(timer); 

  g_print("%ld	all:%.2f seconds was used!
",x,g_timer_elapsed(timer,NULL)); 
  return 0;
} 



#**************************************************************************************************
#* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ * 
#
#   Develop Team :    ls
#   Programmer   :    He YiJun  (storysnail<at>gmail.com )   
#   Comments     :    Ling Ying 
#   License      :    GPLv3
#   Last Update  :    2013-02-14
#* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ *
#*************************************************************************************************/
all:gtest
CC=gcc
CFLAGS = -Wall -ggdb 

OBJFILES = gtest.o 

gtest:$(OBJFILES)
    $(CC) $(CFLAGS) -I/botbrew/include/glib-2.0-L/botbrew/lib -lm -lglib-2.0$(OBJFILES)-o gtest 

gtest.o:gtest.c
    $(CC)$(CFLAGS)-I/botbrew/include/glib-2.0-L/botbrew/lib -lm -lglib-2.0-c gtest.c -o gtest.o 

clean:
    rm -f *.o *~ gtest 



最后是一张程序运行的截图









原文地址:https://www.cnblogs.com/arely/p/4416129.html