[root@Betty WGET]# tar zxvf libevent-2.0.21-stable.tar.gz ...[root@Betty WGET]# cd libevent-2.0.21-stable查看当前 config.* 文件有哪些(对于后面执行 ./configure 后新增文件)
[root@Betty libevent-2.0.21-stable]# ll config* -rwxr-xr-x 1 sunfei sunfei 44826 11月 19 2012 config.guess-rw-r--r-- 1 sunfei sunfei 11968 11月 19 2012 config.h.in-rwxr-xr-x 1 sunfei sunfei 35454 11月 19 2012 config.sub-rwxr-xr-x 1 sunfei sunfei 504592 11月 19 2012 configure-rw-r--r-- 1 sunfei sunfei 21849 11月 18 2012 configure.in[root@Betty libevent-2.0.21-stable]#从 README 中可以看到简单几步就可以进行编译和安装
[root@Betty libevent-2.0.21-stable]# vi README 0. BUILDING AND INSTALLATION (Briefly)$ ./configure$ make$ make verify # (optional)$ sudo make install...查看 configure 配置选项
[root@Betty libevent-2.0.21-stable]# ./configure --help`configure' configures this package to adapt to many kinds of systems.Usage: ./configure [OPTION]... [VAR=VALUE]...To assign environment variables (e.g., CC, CFLAGS...), specify them asVAR=VALUE. See below for descriptions of some of the useful variables.Defaults for the options are specified in brackets.Configuration: -h, --help display this help and exit --help=short display options specific to this package --help=recursive display the short help of all the included packages -V, --version display version information and exit -q, --quiet, --silent do not print `checking ...' messages --cache-file=FILE cache test results in FILE [disabled] -C, --config-cache alias for `--cache-file=config.cache' -n, --no-create do not create output files --srcdir=DIR find the sources in DIR [configure dir or `..']Installation directories: --prefix=PREFIX install architecture-independent files in PREFIX [/usr/local] --exec-prefix=EPREFIX install architecture-dependent files in EPREFIX [PREFIX]By default, `make install' will install all the files in`/usr/local/bin', `/usr/local/lib' etc. You can specifyan installation prefix other than `/usr/local' using `--prefix',for instance `--prefix=$HOME'.For better control, use the options below.Fine tuning of the installation directories: --bindir=DIR user executables [EPREFIX/bin] --sbindir=DIR system admin executables [EPREFIX/sbin] --libexecdir=DIR program executables [EPREFIX/libexec] --sysconfdir=DIR read-only single-machine data [PREFIX/etc] --sharedstatedir=DIR modifiable architecture-independent data [PREFIX/com] --localstatedir=DIR modifiable single-machine data [PREFIX/var] --libdir=DIR object code libraries [EPREFIX/lib] --includedir=DIR C header files [PREFIX/include] --oldincludedir=DIR C header files for non-gcc [/usr/include] --datarootdir=DIR read-only arch.-independent data root [PREFIX/share] --datadir=DIR read-only architecture-independent data [DATAROOTDIR] --infodir=DIR info documentation [DATAROOTDIR/info] --localedir=DIR locale-dependent data [DATAROOTDIR/locale] --mandir=DIR man documentation [DATAROOTDIR/man] --docdir=DIR documentation root [DATAROOTDIR/doc/PACKAGE] --htmldir=DIR html documentation [DOCDIR] --dvidir=DIR dvi documentation [DOCDIR] --pdfdir=DIR pdf documentation [DOCDIR] --psdir=DIR ps documentation [DOCDIR]Program names: --program-prefix=PREFIX prepend PREFIX to installed program names --program-suffix=SUFFIX append SUFFIX to installed program names --program-transform-name=PROGRAM run sed PROGRAM on installed program namesSystem types: --build=BUILD configure for building on BUILD [guessed] --host=HOST cross-compile to build programs to run on HOST [BUILD]Optional Features: --disable-option-checking ignore unrecognized --enable/--with options --disable-FEATURE do not include FEATURE (same as --enable-FEATURE=no) --enable-FEATURE[=ARG] include FEATURE [ARG=yes] --disable-dependency-tracking speeds up one-time build --enable-dependency-tracking do not reject slow dependency extractors --enable-gcc-warnings enable verbose warnings with GCC --disable-thread-support disable support for threading 去使能多线程支持(锁相关) --disable-malloc-replacement disable support for replacing the memory mgt functions --disable-openssl disable support for openssl encryption --disable-debug-mode disable support for running in debug mode --disable-libevent-install, disable installation of libevent --disable-libevent-regress, skip regress in make check --enable-function-sections, make static library allow smaller binaries with --gc-sections --enable-shared[=PKGS] build shared libraries [default=yes] --enable-static[=PKGS] build static libraries [default=yes] --enable-fast-install[=PKGS] optimize for fast installation [default=yes] --disable-libtool-lock avoid locking (might break parallel builds)Optional Packages: --with-PACKAGE[=ARG] use PACKAGE [ARG=yes] --without-PACKAGE do not use PACKAGE (same as --with-PACKAGE=no) --with-pic[=PKGS] try to use only PIC/non-PIC objects [default=use both] --with-gnu-ld assume the C compiler uses GNU ld [default=no] --with-sysroot=DIR Search for dependent libraries within DIR (or the compiler's sysroot if not specified).Some influential environment variables: CC C compiler command CFLAGS C compiler flags LDFLAGS linker flags, e.g. -L因为我需要 libevent 支持多线程锁,只需默认配置即可if you have libraries in a nonstandard directory LIBS libraries to pass to the linker, e.g. -l CPPFLAGS (Objective) C/C++ preprocessor flags, e.g. -I if you have headers in a nonstandard directory CPP C preprocessorUse these variables to override the choices made by `configure' or to helpit to find libraries and programs with nonstandard names/locations.Report bugs to the package provider.[root@Betty libevent-2.0.21-stable]#
[root@Betty libevent-2.0.21-stable]# ./configure...checking for the pthreads library -lpthreads... no -- 1checking whether pthreads work without any flags... yes -- 2checking for joinable pthread attribute... PTHREAD_CREATE_JOINABLE -- 3checking if more special flags are required for pthreads... nochecking size of pthread_t... 8...[root@Betty libevent-2.0.21-stable]# [root@Betty libevent-2.0.21-stable]# [root@Betty libevent-2.0.21-stable]# ll config* -rwxr-xr-x 1 sunfei sunfei 44826 11月 19 2012 config.guess-rw-r--r-- 1 root root 12603 8月 19 14:25 config.h -- new-rw-r--r-- 1 sunfei sunfei 11968 11月 19 2012 config.h.in-rw-r--r-- 1 root root 168882 8月 19 14:25 config.log -- new-rwxr-xr-x 1 root root 65544 8月 19 14:25 config.status -- new-rwxr-xr-x 1 sunfei sunfei 35454 11月 19 2012 config.sub-rwxr-xr-x 1 sunfei sunfei 504592 11月 19 2012 configure-rw-r--r-- 1 sunfei sunfei 21849 11月 18 2012 configure.in[root@Betty libevent-2.0.21-stable]#查看 config.log 的内容(对应 ./configure 输出的详细内容)
[root@Betty libevent-2.0.21-stable]# vi config.log This file contains any messages produced by compilers whilerunning configure, to aid debugging if configure makes a mistake.It was created by configure, which wasgenerated by GNU Autoconf 2.68. Invocation command line was $ ./configure## --------- #### Platform. #### --------- ##hostname = Bettyuname -m = x86_64uname -r = 2.6.32-358.el6.x86_64uname -s = Linuxuname -v = #1 SMP Fri Feb 22 00:31:26 UTC 2013...## ----------- #### Core tests. #### ----------- ##...configure:3214: checking for gccconfigure:3230: found /usr/bin/gccconfigure:3241: result: gccconfigure:3470: checking for C compiler versionconfigure:3479: gcc --version >&5gcc (GCC) 4.4.7 20120313 (Red Hat 4.4.7-11)Copyright (C) 2010 Free Software Foundation, Inc.This is free software; see the source for copying conditions. There is NOwarranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.configure:3490: $? = 0configure:3479: gcc -v >&5Using built-in specs.Target: x86_64-redhat-linuxConfigured with: ../configure --prefix=/usr --mandir=/usr/share/man --infodir=/usr/share/info --with-bugurl=http://bugzilla.redhat.com/bugzilla --enable-bootstrap --enable-shared --enable-threads=posix --enable-checking=release --with-system-zlib --enable-__cxa_atexit --disable-libunwind-exceptions --enable-gnu-unique-object --enable-languages=c,c++,objc,obj-c++,java,fortran,ada --enable-java-awt=gtk --disable-dssi --with-java-home=/usr/lib/jvm/java-1.5.0-gcj-1.5.0.0/jre --enable-libgcj-multifile --enable-java-maintainer-mode --with-ecj-jar=/usr/share/java/eclipse-ecj.jar --disable-libjava-multilib --with-ppl --with-cloog --with-tune=generic --with-arch_32=i686 --build=x86_64-redhat-linuxThread model: posixgcc version 4.4.7 20120313 (Red Hat 4.4.7-11) (GCC)configure:3490: $? = 0...configure:14625: checking for the pthreads library -lpthreads -- 检测能否以 -lpthreads 引用 libpthreads.so 库configure:14658: gcc -o conftest -g -O2 -Wall -fno-strict-aliasing conftest.c -lpthreads -lrt >&5conftest.c: In function 'main':conftest.c:121: warning: null argument where non-null required (argument 1)conftest.c:122: warning: null argument where non-null required (argument 1)conftest.c:122: warning: null argument where non-null required (argument 3)conftest.c:120: warning: 'th' is used uninitialized in this function/usr/bin/ld: cannot find -lpthreads -- 结果发现不能collect2: ld returned 1 exit statusconfigure:14658: $? = 1configure: failed program was:| /* confdefs.h */| #define PACKAGE_NAME ""| #define PACKAGE_TARNAME ""| #define PACKAGE_VERSION ""| #define PACKAGE_STRING ""| #define PACKAGE_BUGREPORT ""| #define PACKAGE_URL ""| #define PACKAGE "libevent"| #define VERSION "2.0.21-stable"| #define NUMERIC_VERSION 0x02001500| #define STDC_HEADERS 1| #define HAVE_SYS_TYPES_H 1| #define HAVE_SYS_STAT_H 1| #define HAVE_STDLIB_H 1| #define HAVE_STRING_H 1| #define HAVE_MEMORY_H 1| #define HAVE_STRINGS_H 1| #define HAVE_INTTYPES_H 1| #define HAVE_STDINT_H 1| #define HAVE_UNISTD_H 1| #define HAVE_DLFCN_H 1| #define LT_OBJDIR ".libs/"| #define HAVE_ZLIB_H 1| #define HAVE_LIBZ 1| #define HAVE_OPENSSL_BIO_H 1| #define HAVE_OPENSSL 1| #define STDC_HEADERS 1| #define HAVE_FCNTL_H 1| #define HAVE_STDARG_H 1| #define HAVE_INTTYPES_H 1| #define HAVE_STDINT_H 1| #define HAVE_STDDEF_H 1| #define HAVE_POLL_H 1| #define HAVE_UNISTD_H 1| #define HAVE_SYS_EPOLL_H 1| #define HAVE_SYS_TIME_H 1| #define HAVE_SYS_QUEUE_H 1| #define HAVE_SYS_PARAM_H 1| #define HAVE_SYS_IOCTL_H 1| #define HAVE_SYS_SELECT_H 1| #define HAVE_NETINET_IN_H 1| #define HAVE_SYS_SOCKET_H 1| #define HAVE_SYS_UIO_H 1| #define HAVE_ARPA_INET_H 1| #define HAVE_SYS_EVENTFD_H 1| #define HAVE_SYS_MMAN_H 1| #define HAVE_SYS_SENDFILE_H 1| #define HAVE_SYS_WAIT_H 1| #define HAVE_NETDB_H 1| #define HAVE_SYS_STAT_H 1| #define HAVE_SYS_SYSCTL_H 1| #define HAVE_TAILQFOREACH 1| #define HAVE_TIMERADD 1| #define HAVE_TIMERCMP 1| #define HAVE_TIMERCLEAR 1| #define HAVE_TIMERISSET 1| #define HAVE_DECL_CTL_KERN 1| #define HAVE_DECL_KERN_RANDOM 1| #define HAVE_DECL_RANDOM_UUID 1| #define HAVE_DECL_KERN_ARND 0| #define TIME_WITH_SYS_TIME 1| #define HAVE_GETTIMEOFDAY 1| #define HAVE_VASPRINTF 1| #define HAVE_FCNTL 1| #define HAVE_CLOCK_GETTIME 1| #define HAVE_STRTOK_R 1| #define HAVE_STRSEP 1| #define HAVE_GETNAMEINFO 1| #define HAVE_INET_NTOP 1| #define HAVE_INET_PTON 1| #define HAVE_SIGNAL 1| #define HAVE_SIGACTION 1| #define HAVE_STRTOLL 1| #define HAVE_INET_ATON 1| #define HAVE_PIPE 1| #define HAVE_EVENTFD 1| #define HAVE_SENDFILE 1| #define HAVE_MMAP 1| #define HAVE_SPLICE 1| #define HAVE_GETEUID 1| #define HAVE_GETEGID 1| #define HAVE_GETPROTOBYNUMBER 1| #define HAVE_SETENV 1| #define HAVE_UNSETENV 1| #define HAVE_PUTENV 1| #define HAVE_SYSCTL 1| #define HAVE_UMASK 1| #define HAVE_GETADDRINFO 1| #define SIZEOF_LONG 8| #define HAVE_SETFD 1| #define HAVE_SELECT 1| #define HAVE_POLL 1| #define HAVE_EPOLL_CTL 1| #define HAVE_EPOLL 1| #define HAVE_UINT64_T 1| #define HAVE_UINT32_T 1| #define HAVE_UINT16_T 1| #define HAVE_UINT8_T 1| #define HAVE_UINTPTR_T 1| #define HAVE_FD_MASK 1| #define SIZEOF_LONG_LONG 8| #define SIZEOF_LONG 8| #define SIZEOF_INT 4| #define SIZEOF_SHORT 2| #define SIZEOF_SIZE_T 8| #define SIZEOF_VOID_P 8| #define HAVE_STRUCT_IN6_ADDR 1| #define HAVE_STRUCT_SOCKADDR_IN6 1| #define HAVE_SA_FAMILY_T 1| #define HAVE_STRUCT_ADDRINFO 1| #define HAVE_STRUCT_SOCKADDR_STORAGE 1| #define HAVE_STRUCT_IN6_ADDR_S6_ADDR32 1| #define HAVE_STRUCT_IN6_ADDR_S6_ADDR16 1| #define HAVE_STRUCT_SOCKADDR_STORAGE_SS_FAMILY 1| /* end confdefs.h. */| #include查看生成的 config.h 文件(只列出和 thread 相关内容)| int| main ()| {| pthread_t th; pthread_join(th, 0);| pthread_attr_init(0); pthread_cleanup_push(0, 0);| pthread_create(0,0,0,0); pthread_cleanup_pop(0);| ;| return 0;| }configure:14667: result: noconfigure:14570: checking whether pthreads work without any flags -- 检查能否无任何 flag 使用 pthreads (这里的用意不太明白)configure:14658: gcc -o conftest -g -O2 -Wall -fno-strict-aliasing conftest.c -lrt >&5conftest.c: In function 'main':conftest.c:121: warning: null argument where non-null required (argument 1)conftest.c:122: warning: null argument where non-null required (argument 1)conftest.c:122: warning: null argument where non-null required (argument 3)conftest.c:120: warning: 'th' is used uninitialized in this functionconfigure:14658: $? = 0configure:14667: result: yesconfigure:14686: checking for joinable pthread attribute -- 检查 pthread 特性是否支持 joinable(注意,这里就变成了 pthread 而不再是 pthreads)configure:14701: gcc -o conftest -g -O2 -Wall -fno-strict-aliasing conftest.c -lrt >&5configure:14701: $? = 0configure:14707: result: PTHREAD_CREATE_JOINABLEconfigure:14717: checking if more special flags are required for pthreadsconfigure:14724: result: noconfigure:14813: checking size of pthread_tconfigure:14818: gcc -o conftest -g -O2 -Wall -fno-strict-aliasing conftest.c -lrt >&5configure:14818: $? = 0configure:14818: ./conftestconfigure:14818: $? = 0configure:14835: result: 8configure:15289: creating ./config.status...
[root@Betty libevent-2.0.21-stable]# vi config.h/* config.h. Generated from config.h.in by configure. *//* config.h.in. Generated from configure.in by autoheader. */.../* Define if libevent should not be compiled with thread support *//* #undef DISABLE_THREAD_SUPPORT */.../* Define if you have POSIX threads libraries and header files. *//* #undef HAVE_PTHREAD *//* Define if we have pthreads on this system */#define HAVE_PTHREADS 1 -- 和 thread 有关的宏,只定义了这个.../* Define to necessary symbol if this constant uses a non-standard name on your system. *//* #undef PTHREAD_CREATE_JOINABLE */.../* The size of `pthread_t', as computed by sizeof. */#define SIZEOF_PTHREAD_T 8在 libevent 源码中搜索 HAVE_PTHREADS ,结果只能找到 _EVENT_HAVE_PTHREADS 。那么两者是什么关系呢? 要回答中问题,需要执行 make
[root@Betty libevent-2.0.21-stable]# maketest -d include/event2 || /bin/mkdir -p include/event2/bin/sed -f ./make-event-config.sed < config.h > include/event2/event-config.hTmv -f include/event2/event-config.hT include/event2/event-config.h...从前几行的输出中,可以看到如何从 config.h 得到 event2/event-config.h 这个头文件的。
- 基于 make-event-config.sed 文件,对 config.h 进行 sed 替换处理后,得到 event2/event-config.hT 文件;
- 再将 event2/event-config.hT 强制变更为(覆盖) event2/event-config.h 。
[root@Betty libevent-2.0.21-stable]# vi make-event-config.sed# Sed script to postprocess config.h into event-config.h. -- 这里说的很清楚了,用于将 config.h 处理为 event-config.h1i\ --指定 event-config.h 开始内容/* event2/event-config.h\ *\ * This file was generated by autoconf when libevent was built, and post-\ * processed by Libevent so that its macros would have a uniform prefix.\ *\ * DO NOT EDIT THIS FILE.\ *\ * Do not rely on macros in this file existing in later versions.\ */\\#ifndef _EVENT2_EVENT_CONFIG_H_\#define _EVENT2_EVENT_CONFIG_H_\$a\\#endif /* event2/event-config.h */ -- 指定 event-config.h 最后内容s/#define /#define _EVENT_/ -- 这里完成了 XXX 到 _EVENT_XXX 的替换s/#undef /#undef _EVENT_/s/#ifndef /#ifndef _EVENT_/所以 make 之后,我们得到了如下的 event-config.h 文件
[root@Betty libevent-2.0.21-stable]# vi include/event2/event-config.h/* event2/event-config.h * * This file was generated by autoconf when libevent was built, and post- * processed by Libevent so that its macros would have a uniform prefix. * * DO NOT EDIT THIS FILE. * * Do not rely on macros in this file existing in later versions. */#ifndef _EVENT2_EVENT_CONFIG_H_#define _EVENT2_EVENT_CONFIG_H_/* config.h. Generated from config.h.in by configure. *//* config.h.in. Generated from configure.in by autoheader. */.../* Define if libevent should not be compiled with thread support *//* #undef _EVENT_DISABLE_THREAD_SUPPORT */.../* Define if you have POSIX threads libraries and header files. *//* #undef _EVENT_HAVE_PTHREAD *//* Define if we have pthreads on this system */#define _EVENT_HAVE_PTHREADS 1.../* Define to necessary symbol if this constant uses a non-standard name on your system. *//* #undef _EVENT_PTHREAD_CREATE_JOINABLE */.../* The size of `pthread_t', as computed by sizeof. */#define _EVENT_SIZEOF_PTHREAD_T 8...这里留个疑问: _EVENT_HAVE_PTHREAD 和 _EVENT_HAVE_PTHREADS 的区别是什么? 从源码 thread.h 中可以看到,此时可以使用 evthread_use_pthreads() 函数了。
#if defined(_EVENT_HAVE_PTHREADS) || defined(_EVENT_IN_DOXYGEN)/** Sets up Libevent for use with Pthreads locking and thread ID functions. Unavailable if Libevent is not build for use with pthreads. Requires libraries to link against Libevent_pthreads as well as Libevent. @return 0 on success, -1 on failure. */int evthread_use_pthreads(void);/** Defined if Libevent was built with support for evthread_use_pthreads() */#define EVTHREAD_USE_PTHREADS_IMPLEMENTED 1#endif至于 evthread_use_pthreads() 函数是做什么的,如何使用,已经不是本文要说明的内容了,网上可以找到相关文章。