Benjamin

静以修身,俭以养德,非澹薄无以明志,非宁静无以致远。
随笔 - 358, 文章 - 0, 评论 - 196, 引用 - 0
数据加载中……

如何将bind改为c++编译

bind的源码是标c,而且Makefile中采用的gcc编译;如果继续采用gcc编译,那么就要将C++的库写到Makefile中,用g++编译,可以直接用c++的库来编译
源码,而不用加任何设置。bind的Makefile由autotools工具之一automake来生成,但是看到am文件,只有in文件,autools打包工具虽然功能强大,但是使用
也极其麻烦,里面的宏很多。
这里我们只要改变bind源码中make文件夹下的rules.in就可以,实现g++编译bind了。rules.in的文件内容如下:
 

# Copyright (C) 2004-2009 Internet Systems Consortium, Inc. ("ISC")
# Copyright (C) 1998-2003 Internet Software Consortium.
#
# Permission to use, copy, modify, and/or distribute this software for any
# purpose with or without fee is hereby granted, provided that the above
# copyright notice and this permission notice appear in all copies.
#
# THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH
# REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
# AND FITNESS.  IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT,
# INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
# LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE
# OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
# PERFORMANCE OF THIS SOFTWARE.

# $Id: rules.in,v 1.68 2009/09/01 18:40:25 jinmei Exp $

###
### Common Makefile rules for BIND 9.
###

###
### Paths
###
### Note: paths that vary by Makefile MUST NOT be listed
### here, or they won't get expanded correctly.

prefix =    @prefix@
exec_prefix =   @exec_prefix@
bindir =    @bindir@
sbindir =   @sbindir@
includedir =    @includedir@
libdir =    @libdir@
sysconfdir =    @sysconfdir@
localstatedir = @localstatedir@
mandir =    @mandir@
datarootdir =   @datarootdir@
export_libdir = @export_libdir@
export_includedir = @export_includedir@

DESTDIR =

@SET_MAKE@

top_builddir = @BIND9_TOP_BUILDDIR@

###
### All
###
### Makefile may define:
### TARGETS

all: subdirs ${TARGETS}

###
### Subdirectories
###
### Makefile may define:
### SUBDIRS

ALL_SUBDIRS = ${SUBDIRS} nulldir

#
# We use a single-colon rule so that additional dependencies of
# subdirectories can be specified after the inclusion of this file.
# The "depend" target is treated the same way.
#
subdirs:
    @for i in ${ALL_SUBDIRS}; do \
        if [ "$$i" != "nulldir" -a -d $$i ]; then \
            echo "making all in `pwd`/$$i"; \
            (cd $$i; ${MAKE} ${MAKEDEFS} DESTDIR="${DESTDIR}" all) || exit 1; \
        fi; \
    done

install:: all

install clean distclean maintainer-clean doc docclean man manclean::
    @for i in ${ALL_SUBDIRS}; do \
        if [ "$$i" != "nulldir" -a -d $$i ]; then \
            echo "making $@ in `pwd`/$$i"; \
            (cd $$i; ${MAKE} ${MAKEDEFS} DESTDIR="${DESTDIR}" $@) || exit 1; \
        fi; \
    done

###
### C++ Programs
###
### Makefile must define
### CC
### Makefile may define
### CFLAGS
### LDFLAGS
### CINCLUDES
### CDEFINES
### CWARNINGS
### User may define externally
###     EXT_CFLAGS

CC =        @CXX@
CFLAGS =    @CXXFLAGS@
LDFLAGS =   @LDFLAGS@
STD_CINCLUDES = @STD_CINCLUDES@
STD_CDEFINES = @STD_CDEFINES@
#STD_CWARNINGS =    @STD_CWARNINGS@

BUILD_CC = @BUILD_CC@
BUILD_CFLAGS = @BUILD_CFLAGS@
BUILD_CPPFLAGS = @BUILD_CPPFLAGS@
BUILD_LDFLAGS = @BUILD_LDFLAGS@
BUILD_LIBS = @BUILD_LIBS@
.SUFFIXES:
.SUFFIXES: .c .@O@

ALWAYS_INCLUDES = -I${top_builddir}
ALWAYS_DEFINES = @ALWAYS_DEFINES@
ALWAYS_WARNINGS =

ALL_CPPFLAGS = \
    ${ALWAYS_INCLUDES} ${CINCLUDES} ${STD_CINCLUDES} \
    ${ALWAYS_DEFINES} ${CDEFINES} ${STD_CDEFINES}

ALL_CFLAGS = ${EXT_CFLAGS} ${ALL_CPPFLAGS} ${CFLAGS} \
    ${ALWAYS_WARNINGS} ${STD_CWARNINGS} ${CWARNINGS}

@BIND9_CO_RULE@
    ${LIBTOOL_MODE_COMPILE} ${CC} ${ALL_CFLAGS} -c $<

SHELL = @SHELL@
LIBTOOL = @LIBTOOL@
LIBTOOL_MODE_COMPILE = ${LIBTOOL} @LIBTOOL_MODE_COMPILE@
LIBTOOL_MODE_INSTALL = ${LIBTOOL} @LIBTOOL_MODE_INSTALL@
LIBTOOL_MODE_LINK = ${LIBTOOL} @LIBTOOL_MODE_LINK@
PURIFY = @PURIFY@

MKDEP = ${SHELL} ${top_builddir}/make/mkdep

###
### This is a template compound command to build an executable binary with
### an internal symbol table.
### This process is tricky. We first link all objects including a tentative
### empty symbol table, then get a tentative list of symbols from the resulting
### binary ($@tmp0). Next, we re-link all objects, but this time with the
### symbol table just created ($tmp@1). The set of symbols should be the same,
### but the corresponding addresses would be changed due to the difference on
### the size of symbol tables. So we create the symbol table and re-create the
### objects once again. Finally, we check the symbol table embedded in the
### final binaryis consistent with the binary itself; otherwise the process is
### terminated.
###
### To minimize the overhead of creating symbol tables, the autoconf switch
### --enable-symtable takes an argument so that the symbol table can be created
### on a per application basis: unless the argument is set to "all", the symbol
### table is created only when a shell (environment) variable "MAKE_SYMTABLE" is
### set to a non-null value in the rule to build the executable binary.
###
### Each Makefile.in that uses this macro is expected to define "LIBS" and
### "NOSYMLIBS"; the former includes libisc with an empty symbol table, and
### the latter includes libisc without the definition of a symbol table.
### The rule to make the executable binary will look like this
### binary@EXEEXT@: ${OBJS}
###     #export MAKE_SYMTABLE="yes"; \ <- enable if symtable is always needed
### export BASEOBJS="${OBJS}"; \
### ${FINALBUILDCMD}
###
### Normally, ${LIBS} includes all necessary libraries to build the binary;
### there are some exceptions however, where the rule lists some of the
### necessary libraries explicitly in addition to (or instead of) ${LIBS},
### like this:
### binary@EXEEXT@: ${OBJS}
###     cc -o $@ ${OBJS} ${OTHERLIB1} ${OTHERLIB2} ${lIBS}
### in order to modify such a rule to use this compound command, a separate
### variable "LIBS0" should be deinfed for the explicitly listed libraries,
### while making sure ${LIBS} still includes libisc. So the above rule would
### be modified as follows:
### binary@EXEEXT@: ${OBJS}
### export BASEOBJS="${OBJS}"; \
### export LIBS0="${OTHERLIB1} ${OTHERLIB2}"; \
###     ${FINALBUILDCMD}
### See bin/check/Makefile.in for a complete example of the use of LIBS0.
###
FINALBUILDCMD = if [ X"${MKSYMTBL_PROGRAM}" = X -o X"$${MAKE_SYMTABLE:-${ALWAYS_MAKE_SYMTABLE}}" = X ] ; then \
        ${LIBTOOL_MODE_LINK} ${PURIFY} ${CC} ${CFLAGS} ${LDFLAGS} \
        -o $@ $${BASEOBJS} $${LIBS0} ${LIBS}; \
    else \
        rm -f $@tmp0; \
        ${LIBTOOL_MODE_LINK} ${PURIFY} ${CC} ${CFLAGS} ${LDFLAGS} \
        -o $@tmp0 $${BASEOBJS} $${LIBS0} ${LIBS} || exit 1; \
        rm -f $@-symtbl.c $@-symtbl.@O@; \
        ${MKSYMTBL_PROGRAM} ${top_srcdir}/util/mksymtbl.pl \
        -o $@-symtbl.c $@tmp0 || exit 1; \
        $(MAKE) $@-symtbl.@O@ || exit 1; \
        rm -f $@tmp1; \
        ${LIBTOOL_MODE_LINK} ${PURIFY} ${CC} ${CFLAGS} ${LDFLAGS} \
        -o $@tmp1 $${BASEOBJS} $@-symtbl.@O@ $${LIBS0} ${NOSYMLIBS} || exit 1; \
        rm -f $@-symtbl.c $@-symtbl.@O@; \
        ${MKSYMTBL_PROGRAM} ${top_srcdir}/util/mksymtbl.pl \
        -o $@-symtbl.c $@tmp1 || exit 1; \
        $(MAKE) $@-symtbl.@O@ || exit 1; \
        ${LIBTOOL_MODE_LINK} ${PURIFY} ${CC} ${CFLAGS} ${LDFLAGS} \
        -o $@tmp2 $${BASEOBJS} $@-symtbl.@O@ $${LIBS0} ${NOSYMLIBS}; \
        ${MKSYMTBL_PROGRAM} ${top_srcdir}/util/mksymtbl.pl \
        -o $@-symtbl2.c $@tmp2; \
        diff $@-symtbl.c $@-symtbl2.c || exit 1;\
        mv $@tmp2 $@; \
        rm -f $@tmp0 $@tmp1 $@tmp2 $@-symtbl2.c; \
    fi

cleandir: distclean
superclean: maintainer-clean

clean distclean maintainer-clean::
    rm -f *.@O@ *.o *.lo *.la core *.core *-symtbl.c *tmp0 *tmp1 *tmp2
    rm -rf .depend .libs

distclean maintainer-clean::
    rm -f Makefile

depend:
    @for i in ${ALL_SUBDIRS}; do \
        if [ "$$i" != "nulldir" -a -d $$i ]; then \
            echo "making depend in `pwd`/$$i"; \
            (cd $$i; ${MAKE} ${MAKEDEFS} DESTDIR="${DESTDIR}" $@) || exit 1; \
        fi; \
    done
    @if [ X"${VPATH}" != X ] ; then \
        if [ X"${SRCS}" != X -a X"${PSRCS}" != X ] ; then \
            echo ${MKDEP} -vpath ${VPATH} ${ALL_CPPFLAGS} ${ALL_CFLAGS} ${SRCS}; \
            ${MKDEP} -vpath ${VPATH} ${ALL_CPPFLAGS} ${ALL_CFLAGS} ${SRCS}; \
            echo ${MKDEP} -vpath ${VPATH} -ap ${ALL_CPPFLAGS} ${ALL_CFLAGS} ${PSRCS}; \
            ${MKDEP} -vpath ${VPATH} -ap ${ALL_CPPFLAGS} ${ALL_CFLAGS} ${PSRCS}; \
            ${DEPENDEXTRA} \
        elif [ X"${SRCS}" != X ] ; then \
            echo ${MKDEP} -vpath ${VPATH} ${ALL_CPPFLAGS} ${ALL_CFLAGS} ${SRCS}; \
            ${MKDEP} -vpath ${VPATH} ${ALL_CPPFLAGS} ${ALL_CFLAGS} ${SRCS}; \
            ${DEPENDEXTRA} \
        elif [ X"${PSRCS}" != X ] ; then \
            echo ${MKDEP} -vpath ${VPATH} ${ALL_CPPFLAGS} ${ALL_CFLAGS} ${PSRCS}; \
            ${MKDEP} -vpath ${VPATH} -p ${ALL_CPPFLAGS} ${ALL_CFLAGS} ${PSRCS}; \
            ${DEPENDEXTRA} \
        fi \
    else \
        if [ X"${SRCS}" != X -a X"${PSRCS}" != X ] ; then \
            echo ${MKDEP} ${ALL_CPPFLAGS} ${ALL_CFLAGS} ${SRCS}; \
            ${MKDEP} ${ALL_CPPFLAGS} ${ALL_CFLAGS} ${SRCS}; \
            echo ${MKDEP} -ap ${ALL_CPPFLAGS} ${ALL_CFLAGS} ${PSRCS}; \
            ${MKDEP} -ap ${ALL_CPPFLAGS} ${ALL_CFLAGS} ${PSRCS}; \
            ${DEPENDEXTRA} \
        elif [ X"${SRCS}" != X ] ; then \
            echo ${MKDEP} ${ALL_CPPFLAGS} ${ALL_CFLAGS} ${SRCS}; \
            ${MKDEP} ${ALL_CPPFLAGS} ${ALL_CFLAGS} ${SRCS}; \
            ${DEPENDEXTRA} \
        elif [ X"${PSRCS}" != X ] ; then \
            echo ${MKDEP} ${ALL_CPPFLAGS} ${ALL_CFLAGS} ${PSRCS}; \
            ${MKDEP} -p ${ALL_CPPFLAGS} ${ALL_CFLAGS} ${PSRCS}; \
            ${DEPENDEXTRA} \
        fi \
    fi

FORCE:

###
### Libraries
###

AR =        @AR@
ARFLAGS =   @ARFLAGS@
RANLIB =    @RANLIB@

###
### Installation
###

INSTALL =       @INSTALL@
INSTALL_PROGRAM =   @INSTALL_PROGRAM@
LINK_PROGRAM =      @LN_S@
INSTALL_SCRIPT =    @INSTALL_SCRIPT@
INSTALL_DATA =      @INSTALL_DATA@

###
### Programs used when generating documentation. It's ok for these
### not to exist when not generating documentation.
###

XSLTPROC =      @XSLTPROC@ --novalid --xinclude --nonet
PERL =          @PERL@
LATEX =         @LATEX@
PDFLATEX =      @PDFLATEX@
W3M =           @W3M@

###
### Script language program used to create internal symbol tables
###
MKSYMTBL_PROGRAM = @MKSYMTBL_PROGRAM@

###
### Switch to create internal symbol table selectively
###
ALWAYS_MAKE_SYMTABLE = @ALWAYS_MAKE_SYMTABLE@

###
### DocBook -> HTML
### DocBook -> man page
###

.SUFFIXES: .docbook .html .1 .2 .3 .4 .5 .6 .7 .8

.docbook.html:
    ${XSLTPROC} -o $@ ${top_srcdir}/doc/xsl/isc-docbook-html.xsl $<

.docbook.1:
    ${XSLTPROC} -o $@ ${top_srcdir}/doc/xsl/isc-manpage.xsl $<

.docbook.2:
    ${XSLTPROC} -o $@ ${top_srcdir}/doc/xsl/isc-manpage.xsl $<

.docbook.3:
    ${XSLTPROC} -o $@ ${top_srcdir}/doc/xsl/isc-manpage.xsl $<

.docbook.4:
    ${XSLTPROC} -o $@ ${top_srcdir}/doc/xsl/isc-manpage.xsl $<

.docbook.5:
    ${XSLTPROC} -o $@ ${top_srcdir}/doc/xsl/isc-manpage.xsl $<

.docbook.6:
    ${XSLTPROC} -o $@ ${top_srcdir}/doc/xsl/isc-manpage.xsl $<

.docbook.7:
    ${XSLTPROC} -o $@ ${top_srcdir}/doc/xsl/isc-manpage.xsl $<

.docbook.8:
    ${XSLTPROC} -o $@ ${top_srcdir}/doc/xsl/isc-manpage.xsl $<
 这里主要是CC = @CXX@ CFLAGS = @CXXFLAGS@,其他的和原来的一样。

由c编译改为C++编译,百分之九十八的错误就是类型转换,还有void*指针及一级指针转为二级指针和三级指针的错误,
这些也是C++和C语言的语法差异;同时g++也禁止在class或struct中出现匿名的枚举或联合体类型,在C语言中可以将一个
(枚举或联合)类型的声明放到结构体中,但是C++认为那是匿名数据类型;在class或struct中的枚举可以用类属符来直接引用。

posted on 2011-03-03 22:16 Benjamin 阅读(907) 评论(2)  编辑 收藏 引用 所属分类: linux

评论

# This forum needed shainkg up and you’ve just done that. Great post!  回复  更多评论   

This forum needed shainkg up and you’ve just done that. Great post!
2011-05-26 17:09 | Sewana

只有注册用户登录后才能发表评论。
【推荐】超50万行VC++源码: 大型组态工控、电力仿真CAD与GIS源码库
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理