首页 > 编程语言 >C语言用GNU源码编译建构系统工具(GNU BUILD SYSTEM)编译创建动态库

C语言用GNU源码编译建构系统工具(GNU BUILD SYSTEM)编译创建动态库

时间:2024-11-01 08:50:01浏览次数:3  
标签:libmg seq sequence make GNU 编译 源码 songvm works

C语言用GNU源码编译建构系统工具(GNU BUILD SYSTEM)编译创建动态库

创建工作目录

  • 工作目录libmg(mg即muggles,一定要有一个自己的名称空间namespace)

工作目录结构如下所示:

libmg
  \- Makefile.am
  \- src
    \- Makefile.am
    \- sequence.c
    \- libmg.h
    \- mg
      \- Makefile.am
      \- types.h
      \- sequence.h
  \- tests
    \- Makefile.am
    \- test_seq.c

每个子目录下都编辑一个Makefile.am文件!!!

  • 主目录libmg/Makefile.am内容如下:
SUBDIRS = src tests
  • 源码目录libmg/src/Makefile.am内容如下:
SUBDIRS = mg

lib_LTLIBRARIES = libmg.la

libmg_la_SOURCES = libmg.h    \
	mg/types.h \
        sequence.c mg/sequence.h

libmg_la_LDFLAGS = -release 1.0

include_HEADERS = libmg.h
nobase_include_HEADERS = \
	mg/types.h \
        mg/sequence.h
  • 源码目录下子目录mg的libmg/src/mg/Makefile.am内容如下:
EXTRA_DIST = types.h sequence.h
  • 测试目录tests/Makefile.am内容如下:
AM_CFLAGS = -I ../src -I .
AM_LDFLAGS = -L../src -lmg

check_PROGRAMS = test_seq

test_seq_SOURCES = test_seq.c

TESTS = $(check_PROGRAMS)

将源码sequence.c改造一下

  • 主头文件libmg/src/libmg.h代码如下:
/* filename : libmg.h */
#ifndef __LIBMG_HEAD
#define __LIBMG_HEAD

#include "mg/types.h"
#include "mg/sequence.h"

#endif/*__LIBMG_HEAD*/
  • 主源码文件libmg/src/sequence.c代码如下:
/* filename: sequence.c */
#include <stdio.h>
#include <stdlib.h>

#include "mg/sequence.h"

/* create a new sequence */
Sequence *
mg_sequence_new (int pagesize)
{
  Sequence *seq = (Sequence*) malloc (sizeof(Sequence));
  seq->pagesize = pagesize;
  seq->pages = 1;
  seq->size = 0;
  seq->elts = (void**) malloc (seq->pages * seq->pagesize * sizeof(void*));
  for (int i = 0; i < seq->pagesize; i++)
    seq->elts[i] = NULL;
  return seq;
}

/* free every elements */
void
mg_sequence_free_elements (Sequence *seq)
{
  for (int i = 0; i < seq->size; i++)
    free (seq->elts[i]);
}

/* free the sequence */
void
mg_sequence_free (Sequence *seq)
{
  free (seq->elts);
  free (seq);
}

/* sequence is empty return 1 else return 0 */
int
mg_sequence_is_empty (Sequence *seq)
{
  if (seq->size == 0) return 1;
  return 0;
}

/* sequence is full return 1 else return 0 */
/*int
mg_sequence_is_full (Sequence *seq)
{
  if (seq->size == seq->maxsize) return 1;
  return 0;
}
*/

/* get sequence size */
int
mg_sequence_size (Sequence *seq)
{
  return seq->size;
}

/* append a val into sequence */
void
mg_sequence_append (Sequence *seq, void *val)
{
  seq->elts[seq->size] = val;
  seq->size = seq->size + 1;
  if (seq->size == seq->pages * seq->pagesize)
    {
      seq->pages = seq->pages + 1;
      seq->elts = realloc (seq->elts, seq->pages * seq->pagesize * sizeof(void*));
    }
}

/* insert a val at idx into sequence */
void
mg_sequence_insert (Sequence *seq, int idx, void *val)
{
  for (int i = seq->size - 1; i >= idx; i--)
    seq->elts[i+1] = seq->elts[i];
  seq->elts[idx] = val;
  seq->size = seq->size + 1;
}

/* set a val at idx of sequence */
void
mg_sequence_set (Sequence *seq, int idx, void *val)
{
  seq->elts[idx] = val;
}

/* remove a val at idx of sequence */
void
mg_sequence_remove (Sequence *seq, int idx)
{
  for (int i = idx; i <= seq->size; i++)
    seq->elts[i] = seq->elts[i+1];
  seq->size = seq->size - 1;
}

/* get a val at idx of sequence */
void *
mg_sequence_get (Sequence *seq, int idx)
{
  return seq->elts[idx];
}

/* reverse the sequence */
void
mg_sequence_reverse (Sequence *seq)
{
  for (int i = 0, j = seq->size - 1; i < seq->size / 2; i++, j--)
    {
      void *tmp = seq->elts[i];
      seq->elts[i] = seq->elts[j];
      seq->elts[j] = tmp;
    }
}

/* call mgfunc on each element */
void
mg_sequence_foreach (Sequence *seq, MgFunc mgfunc)
{
  for (int i = 0; i < seq->size; i++)
    mgfunc (seq->elts[i]);
}

/* ---------------------------------------- */
  • 自定义数据类型头文件libmg/src/mg/types.h代码如下:
/* filename : types.h */
#ifndef __TYPES_HEAD
#define __TYPES_HEAD

/* define base int datatype */
typedef unsigned long  ulong;
typedef unsigned int   uint;
typedef unsigned char  uchar;
typedef unsigned short ushort;

/* define function pointer with void* arg and without return */
typedef void (*MgFunc) (void *val);

#endif/*__TYPES_HEAD*/
  • 自定义sequence头文件libmg/src/mg/sequence.h代码如下:
/* filename : sequence.h */
#ifndef __SEQUENCE_HEAD
#define __SEQUENCE_HEAD

#include "types.h"

/* define Sequence datatype */
typedef struct _Sequence Sequence;
struct _Sequence {
  int pagesize; //page size
  int pages;    //pages
  int size;     //size
  void **elts;  //elements
};

/* create a new sequence */
Sequence*
mg_sequence_new (int pagesize);

/* free every elements */
void
mg_sequence_free_elements (Sequence *seq);

/* free the sequence */
void
mg_sequence_free (Sequence *seq);

/* sequence is empty return 1 else return 0 */
int
mg_sequence_is_empty (Sequence *seq);

/* get sequence size */
int
mg_sequence_size (Sequence *seq);

/* append a val into sequence */
void
mg_sequence_append (Sequence *seq, void *val);

/* insert a val at idx into sequence */
void
mg_sequence_insert (Sequence *seq, int idx, void *val);


/* set a val at idx of sequence */
void
mg_sequence_set (Sequence *seq, int idx, void *val);

/* remove a val at idx of sequence */
void
mg_sequence_remove (Sequence *seq, int idx);

/* get a val at idx of sequence */
void *
mg_sequence_get (Sequence *seq, int idx);

/* reverse the sequence */
void
mg_sequence_reverse (Sequence *seq);

/* call mgfunc on each element */
void
mg_sequence_foreach (Sequence *seq, MgFunc mgfunc);

#endif/*__SEQUENCE_HEAD*/
  • 源码测试文件libmg/tests/test_seq.c代码如下:
/* filename : test_seq.c */
#include <stdio.h>
#include <stdlib.h>

#include "libmg.h"

/* define function for MgFunc to output long int */
void
out_longint (void *val)
{
  printf ("%ld ", (long)(val));
}

/* test append insert foreach reverse remove */
void
test_sequence_longint (void)
{
  Sequence *seq = mg_sequence_new (8);

  for (long i = 0; i < 10; i++)
    mg_sequence_append (seq, (void*)(i + 1000));

  printf ("Test sequence new, append, foreach method:\n");
  mg_sequence_foreach (seq, out_longint);

  printf ("\nTest sequence insert method:\n");
  mg_sequence_insert (seq, 5, (void*)(8888));
  mg_sequence_foreach (seq, out_longint);

  printf ("\nTest sequence reverse method:\n");
  mg_sequence_reverse (seq);
  mg_sequence_foreach (seq, out_longint);

  printf ("\nTest sequence remove method:\n");
  mg_sequence_remove (seq, 5);
  mg_sequence_foreach (seq, out_longint);

  printf ("\nSequence page size : %d\n", seq->pagesize);
  printf ("Sequence size : %d\n", seq->size);
  printf ("Sequence page : %d\n", seq->pages);

  printf ("Sequence val at index 9 is %ld\n", (long)mg_sequence_get(seq, 9));

  mg_sequence_free (seq);
}

/* define function for MgFunc to output char* */
void
out_string (void *val)
{
  printf ("%s ", (char*)val);
}

/* test sequence new free append foreach */
void
test_sequence_string (void)
{
  char *buff[6] = {"Not", "Only", "Test", "Here", "Another", "Behind"};
  Sequence *seq = mg_sequence_new (8);
  for (int i = 0; i < 6; i++)
    mg_sequence_append (seq, buff[i]);
  mg_sequence_foreach(seq, out_string);
  printf ("\n");
  mg_sequence_free (seq);
}

/* test sequence free elements */
void
test_sequence_string_malloc (void)
{
  Sequence *seq = mg_sequence_new (8);

  for (int i = 1000; i < 1010; i++)
    {
      char *buf = (char*) malloc (16);
      sprintf (buf, "demo-%d", i);
      mg_sequence_append (seq, buf);
    }

  mg_sequence_foreach(seq, out_string);
  printf ("\n");

  mg_sequence_free_elements (seq);
  mg_sequence_free (seq);
}

/**/
int
main (int argc, char *argv[])
{
  printf ("------------------------------\n");
  test_sequence_longint ();
  printf ("------------------------------\n");
  test_sequence_string ();
  printf ("------------------------------\n");
  test_sequence_string_malloc ();
  printf ("------------------------------\n");
  return 0;
}
/* -----(:/.^.\:)-----*/
  • 注意libmg.h头文件,用到sequence相关函数的话,包含libmg.h即可!!!

运行autoscan命令,生成配置文件

  • 运行 autoscan
  • 更改文件名 mv configure.scan configure.ac

编辑配置文件configure.ac,修改以下四处

  • 修改包名字、版本号、报错邮件地址 AC_INIT([libmg], [0.1], [[email protected]])
  • 添加AUTOMAKE宏 AM_INIT_AUTOMAKE([ -Wall -Werror foreign ])
  • 添加检查ar工具宏 AM_PROG_AR
  • 添加检查LIBTOOL宏 LT_INIT

修改后内容如下:

#                                               -*- Autoconf -*-
# Process this file with autoconf to produce a configure script.

AC_PREREQ([2.69])
AC_INIT([libmg], [0.1], [[email protected]])
AM_INIT_AUTOMAKE([ -Wall -Werror foreign ])
AC_CONFIG_SRCDIR([tests/test_seq.c])
AC_CONFIG_HEADERS([config.h])

# Checks for programs.
AM_PROG_AR
AC_PROG_CC

#
LT_INIT

# Checks for libraries.
# FIXME: Replace `main' with a function in `-lmg':
# AC_CHECK_LIB([mg], [main])

# Checks for header files.
AC_CHECK_HEADERS([stdlib.h])

# Checks for typedefs, structures, and compiler characteristics.

# Checks for library functions.
AC_FUNC_MALLOC
AC_FUNC_REALLOC

AC_CONFIG_FILES([Makefile
                 src/Makefile
                 src/mg/Makefile
                 tests/Makefile])
AC_OUTPUT

运行命令:autoreconf --install 生成 configure 脚本

如下所示:

songvm@ubuntu:~/works/xdn/aoo/libmg$ ls
autoscan.log  configure.ac  Makefile.am  src  tests
songvm@ubuntu:~/works/xdn/aoo/libmg$ autoreconf --install
libtoolize: putting auxiliary files in '.'.
libtoolize: copying file './ltmain.sh'
libtoolize: Consider adding 'AC_CONFIG_MACRO_DIRS([m4])' to configure.ac,
libtoolize: and rerunning libtoolize and aclocal.
libtoolize: Consider adding '-I m4' to ACLOCAL_AMFLAGS in Makefile.am.
configure.ac:11: installing './ar-lib'
configure.ac:11: installing './compile'
configure.ac:15: installing './config.guess'
configure.ac:15: installing './config.sub'
configure.ac:6: installing './install-sh'
configure.ac:6: installing './missing'
src/Makefile.am: installing './depcomp'
parallel-tests: installing './test-driver'
songvm@ubuntu:~/works/xdn/aoo/libmg$ 

运行 configure 脚本,生成 Makefile

  • 运行命令:./configure --prefix=/tmp/boo ,注意加参数!!!

如下所示:

songvm@ubuntu:~/works/xdn/aoo/libmg$ ls
aclocal.m4      compile       configure     ltmain.sh    src
ar-lib          config.guess  configure.ac  Makefile.am  test-driver
autom4te.cache  config.h.in   depcomp       Makefile.in  tests
autoscan.log    config.sub    install-sh    missing
songvm@ubuntu:~/works/xdn/aoo/libmg$ ./configure --prefix=/tmp/boo
checking for a BSD-compatible install... /usr/bin/install -c
checking whether build environment is sane... yes
checking for a thread-safe mkdir -p... /bin/mkdir -p
checking for gawk... no
checking for mawk... mawk
checking whether make sets $(MAKE)... yes
checking whether make supports nested variables... yes
checking for style of include used by make... GNU
checking for gcc... gcc
checking whether the C compiler works... yes
checking for C compiler default output file name... a.out
checking for suffix of executables... 
checking whether we are cross compiling... no
checking for suffix of object files... o
checking whether we are using the GNU C compiler... yes
checking whether gcc accepts -g... yes
checking for gcc option to accept ISO C89... none needed
checking whether gcc understands -c and -o together... yes
checking dependency style of gcc... gcc3
checking for ar... ar
checking the archiver (ar) interface... ar
checking for gcc... (cached) gcc
checking whether we are using the GNU C compiler... (cached) yes
checking whether gcc accepts -g... (cached) yes
checking for gcc option to accept ISO C89... (cached) none needed
checking whether gcc understands -c and -o together... (cached) yes
checking dependency style of gcc... (cached) gcc3
checking build system type... x86_64-pc-linux-gnu
checking host system type... x86_64-pc-linux-gnu
checking how to print strings... printf
checking for a sed that does not truncate output... /bin/sed
checking for grep that handles long lines and -e... /bin/grep
checking for egrep... /bin/grep -E
checking for fgrep... /bin/grep -F
checking for ld used by gcc... /usr/bin/ld
checking if the linker (/usr/bin/ld) is GNU ld... yes
checking for BSD- or MS-compatible name lister (nm)... /usr/bin/nm -B
checking the name lister (/usr/bin/nm -B) interface... BSD nm
checking whether ln -s works... yes
checking the maximum length of command line arguments... 1635000
checking how to convert x86_64-pc-linux-gnu file names to x86_64-pc-linux-gnu format... func_convert_file_noop
checking how to convert x86_64-pc-linux-gnu file names to toolchain format... func_convert_file_noop
checking for /usr/bin/ld option to reload object files... -r
checking for objdump... objdump
checking how to recognize dependent libraries... pass_all
checking for dlltool... no
checking how to associate runtime and link libraries... printf %s\n
checking for archiver @FILE support... @
checking for strip... strip
checking for ranlib... ranlib
checking command to parse /usr/bin/nm -B output from gcc object... ok
checking for sysroot... no
checking for a working dd... /bin/dd
checking how to truncate binary pipes... /bin/dd bs=4096 count=1
checking for mt... mt
checking if mt is a manifest tool... no
checking how to run the C preprocessor... gcc -E
checking for ANSI C header files... yes
checking for sys/types.h... yes
checking for sys/stat.h... yes
checking for stdlib.h... yes
checking for string.h... yes
checking for memory.h... yes
checking for strings.h... yes
checking for inttypes.h... yes
checking for stdint.h... yes
checking for unistd.h... yes
checking for dlfcn.h... yes
checking for objdir... .libs
checking if gcc supports -fno-rtti -fno-exceptions... no
checking for gcc option to produce PIC... -fPIC -DPIC
checking if gcc PIC flag -fPIC -DPIC works... yes
checking if gcc static flag -static works... yes
checking if gcc supports -c -o file.o... yes
checking if gcc supports -c -o file.o... (cached) yes
checking whether the gcc linker (/usr/bin/ld -m elf_x86_64) supports shared libraries... yes
checking whether -lc should be explicitly linked in... no
checking dynamic linker characteristics... GNU/Linux ld.so
checking how to hardcode library paths into programs... immediate
checking whether stripping libraries is possible... yes
checking if libtool supports shared libraries... yes
checking whether to build shared libraries... yes
checking whether to build static libraries... yes
checking for stdlib.h... (cached) yes
checking for stdlib.h... (cached) yes
checking for GNU libc compatible malloc... yes
checking for stdlib.h... (cached) yes
checking for GNU libc compatible realloc... yes
checking that generated files are newer than configure... done
configure: creating ./config.status
config.status: creating Makefile
config.status: creating src/Makefile
config.status: creating src/mg/Makefile
config.status: creating tests/Makefile
config.status: creating config.h
config.status: executing depfiles commands
config.status: executing libtool commands
songvm@ubuntu:~/works/xdn/aoo/libmg$ 

编译 make

  • 编译命令make默认参数为all

如下所示:

songvm@ubuntu:~/works/xdn/aoo/libmg$ make
make  all-recursive
make[1]: 进入目录“/home/songvm/works/xdn/aoo/libmg”
Making all in src
make[2]: 进入目录“/home/songvm/works/xdn/aoo/libmg/src”
Making all in mg
make[3]: 进入目录“/home/songvm/works/xdn/aoo/libmg/src/mg”
make[3]: 对“all”无需做任何事。
make[3]: 离开目录“/home/songvm/works/xdn/aoo/libmg/src/mg”
make[3]: 进入目录“/home/songvm/works/xdn/aoo/libmg/src”
/bin/bash ../libtool  --tag=CC   --mode=compile gcc -DHAVE_CONFIG_H -I. -I..     -g -O2 -MT sequence.lo -MD -MP -MF .deps/sequence.Tpo -c -o sequence.lo sequence.c
libtool: compile:  gcc -DHAVE_CONFIG_H -I. -I.. -g -O2 -MT sequence.lo -MD -MP -MF .deps/sequence.Tpo -c sequence.c  -fPIC -DPIC -o .libs/sequence.o
libtool: compile:  gcc -DHAVE_CONFIG_H -I. -I.. -g -O2 -MT sequence.lo -MD -MP -MF .deps/sequence.Tpo -c sequence.c -o sequence.o >/dev/null 2>&1
mv -f .deps/sequence.Tpo .deps/sequence.Plo
/bin/bash ../libtool  --tag=CC   --mode=link gcc  -g -O2 -release 1.0  -o libmg.la -rpath /tmp/boo/lib sequence.lo  
libtool: link: gcc -shared  -fPIC -DPIC  .libs/sequence.o    -g -O2   -Wl,-soname -Wl,libmg-1.0.so -o .libs/libmg-1.0.so
libtool: link: (cd ".libs" && rm -f "libmg.so" && ln -s "libmg-1.0.so" "libmg.so")
libtool: link: ar cru .libs/libmg.a  sequence.o
ar: `u' modifier ignored since `D' is the default (see `U')
libtool: link: ranlib .libs/libmg.a
libtool: link: ( cd ".libs" && rm -f "libmg.la" && ln -s "../libmg.la" "libmg.la" )
make[3]: 离开目录“/home/songvm/works/xdn/aoo/libmg/src”
make[2]: 离开目录“/home/songvm/works/xdn/aoo/libmg/src”
Making all in tests
make[2]: 进入目录“/home/songvm/works/xdn/aoo/libmg/tests”
make[2]: 对“all”无需做任何事。
make[2]: 离开目录“/home/songvm/works/xdn/aoo/libmg/tests”
make[2]: 进入目录“/home/songvm/works/xdn/aoo/libmg”
make[2]: 离开目录“/home/songvm/works/xdn/aoo/libmg”
make[1]: 离开目录“/home/songvm/works/xdn/aoo/libmg”
songvm@ubuntu:~/works/xdn/aoo/libmg$ 

编译测试 make check

  • make check 编译测试目录中的源码并运行,运行输出结果保存到.log文件中!

如下所示:

songvm@ubuntu:~/works/xdn/aoo/libmg$ make check
Making check in src
make[1]: 进入目录“/home/songvm/works/xdn/aoo/libmg/src”
Making check in mg
make[2]: 进入目录“/home/songvm/works/xdn/aoo/libmg/src/mg”
make[2]: 对“check”无需做任何事。
make[2]: 离开目录“/home/songvm/works/xdn/aoo/libmg/src/mg”
make[2]: 进入目录“/home/songvm/works/xdn/aoo/libmg/src”
make[2]: 对“check-am”无需做任何事。
make[2]: 离开目录“/home/songvm/works/xdn/aoo/libmg/src”
make[1]: 离开目录“/home/songvm/works/xdn/aoo/libmg/src”
Making check in tests
make[1]: 进入目录“/home/songvm/works/xdn/aoo/libmg/tests”
make  test_seq
make[2]: 进入目录“/home/songvm/works/xdn/aoo/libmg/tests”
gcc -DHAVE_CONFIG_H -I. -I..    -I ../src -I . -g -O2 -MT test_seq.o -MD -MP -MF .deps/test_seq.Tpo -c -o test_seq.o test_seq.c
mv -f .deps/test_seq.Tpo .deps/test_seq.Po
/bin/bash ../libtool  --tag=CC   --mode=link gcc -I ../src -I . -g -O2 -L../src -lmg  -o test_seq test_seq.o  
libtool: link: gcc -I ../src -I . -g -O2 -o .libs/test_seq test_seq.o  -L../src /home/songvm/works/xdn/aoo/libmg/src/.libs/libmg.so -Wl,-rpath -Wl,/tmp/boo/lib
make[2]: 离开目录“/home/songvm/works/xdn/aoo/libmg/tests”
make  check-TESTS
make[2]: 进入目录“/home/songvm/works/xdn/aoo/libmg/tests”
make[3]: 进入目录“/home/songvm/works/xdn/aoo/libmg/tests”
PASS: test_seq
============================================================================
Testsuite summary for libmg 0.1
============================================================================
# TOTAL: 1
# PASS:  1
# SKIP:  0
# XFAIL: 0
# FAIL:  0
# XPASS: 0
# ERROR: 0
============================================================================
make[3]: 离开目录“/home/songvm/works/xdn/aoo/libmg/tests”
make[2]: 离开目录“/home/songvm/works/xdn/aoo/libmg/tests”
make[1]: 离开目录“/home/songvm/works/xdn/aoo/libmg/tests”
make[1]: 进入目录“/home/songvm/works/xdn/aoo/libmg”
make[1]: 离开目录“/home/songvm/works/xdn/aoo/libmg”
songvm@ubuntu:~/works/xdn/aoo/libmg$ 
  • 输出结果文件libmg/tests/test_seq.log内容如下:
------------------------------
Test sequence new, append, foreach method:
1000 1001 1002 1003 1004 1005 1006 1007 1008 1009 
Test sequence insert method:
1000 1001 1002 1003 1004 8888 1005 1006 1007 1008 1009 
Test sequence reverse method:
1009 1008 1007 1006 1005 8888 1004 1003 1002 1001 1000 
Test sequence remove method:
1009 1008 1007 1006 1005 1004 1003 1002 1001 1000 
Sequence page size : 8
Sequence size : 10
Sequence page : 2
Sequence val at index 9 is 1000
------------------------------
Not Only Test Here Another Behind 
------------------------------
demo-1000 demo-1001 demo-1002 demo-1003 demo-1004 demo-1005 demo-1006 demo-1007 demo-1008 demo-1009 
------------------------------
PASS test_seq (exit status: 0)

打包源码 make dist

  • make dist 生成源码包 libmg-0.1.tar.gz

如下所示:

songvm@ubuntu:~/works/xdn/aoo/libmg$ make dist
make  dist-gzip am__post_remove_distdir='@:'
make[1]: 进入目录“/home/songvm/works/xdn/aoo/libmg”
if test -d "libmg-0.1"; then find "libmg-0.1" -type d ! -perm -200 -exec chmod u+w {} ';' && rm -rf "libmg-0.1" || { sleep 5 && rm -rf "libmg-0.1"; }; else :; fi
test -d "libmg-0.1" || mkdir "libmg-0.1"
 (cd src && make  top_distdir=../libmg-0.1 distdir=../libmg-0.1/src \
     am__remove_distdir=: am__skip_length_check=: am__skip_mode_fix=: distdir)
make[2]: 进入目录“/home/songvm/works/xdn/aoo/libmg/src”
 (cd mg && make  top_distdir=../../libmg-0.1 distdir=../../libmg-0.1/src/mg \
     am__remove_distdir=: am__skip_length_check=: am__skip_mode_fix=: distdir)
make[3]: 进入目录“/home/songvm/works/xdn/aoo/libmg/src/mg”
make[3]: 离开目录“/home/songvm/works/xdn/aoo/libmg/src/mg”
make[2]: 离开目录“/home/songvm/works/xdn/aoo/libmg/src”
 (cd tests && make  top_distdir=../libmg-0.1 distdir=../libmg-0.1/tests \
     am__remove_distdir=: am__skip_length_check=: am__skip_mode_fix=: distdir)
make[2]: 进入目录“/home/songvm/works/xdn/aoo/libmg/tests”
make[2]: 离开目录“/home/songvm/works/xdn/aoo/libmg/tests”
test -n "" \
|| find "libmg-0.1" -type d ! -perm -755 \
	-exec chmod u+rwx,go+rx {} \; -o \
  ! -type d ! -perm -444 -links 1 -exec chmod a+r {} \; -o \
  ! -type d ! -perm -400 -exec chmod a+r {} \; -o \
  ! -type d ! -perm -444 -exec /bin/bash /home/songvm/works/xdn/aoo/libmg/install-sh -c -m a+r {} {} \; \
|| chmod -R a+r "libmg-0.1"
tardir=libmg-0.1 && ${TAR-tar} chof - "$tardir" | eval GZIP= gzip --best -c >libmg-0.1.tar.gz
make[1]: 离开目录“/home/songvm/works/xdn/aoo/libmg”
if test -d "libmg-0.1"; then find "libmg-0.1" -type d ! -perm -200 -exec chmod u+w {} ';' && rm -rf "libmg-0.1" || { sleep 5 && rm -rf "libmg-0.1"; }; else :; fi
songvm@ubuntu:~/works/xdn/aoo/libmg$ ls
aclocal.m4      config.h       configure.ac      Makefile     test-driver
ar-lib          config.h.in    depcomp           Makefile.am  tests
autom4te.cache  config.log     install-sh        Makefile.in
autoscan.log    config.status  libmg-0.1.tar.gz  missing
compile         config.sub     libtool           src
config.guess    configure      ltmain.sh         stamp-h1
songvm@ubuntu:~/works/xdn/aoo/libmg$ 

安装和缷载 make install / make uninstall

  • 安装 make install

如下所示:

songvm@ubuntu:~/works/xdn/aoo/libmg$ make install
Making install in src
make[1]: 进入目录“/home/songvm/works/xdn/aoo/libmg/src”
Making install in mg
make[2]: 进入目录“/home/songvm/works/xdn/aoo/libmg/src/mg”
make[3]: 进入目录“/home/songvm/works/xdn/aoo/libmg/src/mg”
make[3]: 对“install-exec-am”无需做任何事。
make[3]: 对“install-data-am”无需做任何事。
make[3]: 离开目录“/home/songvm/works/xdn/aoo/libmg/src/mg”
make[2]: 离开目录“/home/songvm/works/xdn/aoo/libmg/src/mg”
make[2]: 进入目录“/home/songvm/works/xdn/aoo/libmg/src”
make[3]: 进入目录“/home/songvm/works/xdn/aoo/libmg/src”
 /bin/mkdir -p '/tmp/boo/lib'
 /bin/bash ../libtool   --mode=install /usr/bin/install -c   libmg.la '/tmp/boo/lib'
libtool: install: /usr/bin/install -c .libs/libmg-1.0.so /tmp/boo/lib/libmg-1.0.so
libtool: install: (cd /tmp/boo/lib && { ln -s -f libmg-1.0.so libmg.so || { rm -f libmg.so && ln -s libmg-1.0.so libmg.so; }; })
libtool: install: /usr/bin/install -c .libs/libmg.lai /tmp/boo/lib/libmg.la
libtool: install: /usr/bin/install -c .libs/libmg.a /tmp/boo/lib/libmg.a
libtool: install: chmod 644 /tmp/boo/lib/libmg.a
libtool: install: ranlib /tmp/boo/lib/libmg.a
libtool: finish: PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin:/sbin" ldconfig -n /tmp/boo/lib
----------------------------------------------------------------------
Libraries have been installed in:
   /tmp/boo/lib

If you ever happen to want to link against installed libraries
in a given directory, LIBDIR, you must either use libtool, and
specify the full pathname of the library, or use the '-LLIBDIR'
flag during linking and do at least one of the following:
   - add LIBDIR to the 'LD_LIBRARY_PATH' environment variable
     during execution
   - add LIBDIR to the 'LD_RUN_PATH' environment variable
     during linking
   - use the '-Wl,-rpath -Wl,LIBDIR' linker flag
   - have your system administrator add LIBDIR to '/etc/ld.so.conf'

See any operating system documentation about shared libraries for
more information, such as the ld(1) and ld.so(8) manual pages.
----------------------------------------------------------------------
 /bin/mkdir -p '/tmp/boo/include'
 /usr/bin/install -c -m 644 libmg.h '/tmp/boo/include'
 /bin/mkdir -p '/tmp/boo/include'
 /bin/mkdir -p '/tmp/boo/include/mg'
 /usr/bin/install -c -m 644  mg/types.h mg/sequence.h '/tmp/boo/include/mg'
make[3]: 离开目录“/home/songvm/works/xdn/aoo/libmg/src”
make[2]: 离开目录“/home/songvm/works/xdn/aoo/libmg/src”
make[1]: 离开目录“/home/songvm/works/xdn/aoo/libmg/src”
Making install in tests
make[1]: 进入目录“/home/songvm/works/xdn/aoo/libmg/tests”
make[2]: 进入目录“/home/songvm/works/xdn/aoo/libmg/tests”
make[2]: 对“install-exec-am”无需做任何事。
make[2]: 对“install-data-am”无需做任何事。
make[2]: 离开目录“/home/songvm/works/xdn/aoo/libmg/tests”
make[1]: 离开目录“/home/songvm/works/xdn/aoo/libmg/tests”
make[1]: 进入目录“/home/songvm/works/xdn/aoo/libmg”
make[2]: 进入目录“/home/songvm/works/xdn/aoo/libmg”
make[2]: 对“install-exec-am”无需做任何事。
make[2]: 对“install-data-am”无需做任何事。
make[2]: 离开目录“/home/songvm/works/xdn/aoo/libmg”
make[1]: 离开目录“/home/songvm/works/xdn/aoo/libmg”
songvm@ubuntu:~/works/xdn/aoo/libmg$ 
  • 检查一下安装的头文件和动态库,是否如预期安装到相对应的目录中去了!!!

如下所示:

songvm@ubuntu:~/works/xdn/aoo/libmg$ ls /tmp/boo/
include  lib
songvm@ubuntu:~/works/xdn/aoo/libmg$ ls /tmp/boo/include/
libmg.h  mg
songvm@ubuntu:~/works/xdn/aoo/libmg$ ls /tmp/boo/include/mg
sequence.h  types.h
songvm@ubuntu:~/works/xdn/aoo/libmg$ ls /tmp/boo/lib
libmg-1.0.so  libmg.a  libmg.la  libmg.so
songvm@ubuntu:~/works/xdn/aoo/libmg$ ll /tmp/boo/lib
总用量 44
drwxrwxr-x 2 songvm songvm  4096 10月 23 13:48 ./
drwxrwxr-x 4 songvm songvm  4096 10月 23 13:48 ../
-rwxr-xr-x 1 songvm songvm 14320 10月 23 13:48 libmg-1.0.so*
-rw-r--r-- 1 songvm songvm 13182 10月 23 13:48 libmg.a
-rwxr-xr-x 1 songvm songvm   917 10月 23 13:48 libmg.la*
lrwxrwxrwx 1 songvm songvm    12 10月 23 13:48 libmg.so -> libmg-1.0.so*
songvm@ubuntu:~/works/xdn/aoo/libmg$ 
  • 缷载 make uninstall

如下所示:

songvm@ubuntu:~/works/xdn/aoo/libmg$ make uninstall
Making uninstall in src
make[1]: 进入目录“/home/songvm/works/xdn/aoo/libmg/src”
Making uninstall in mg
make[2]: 进入目录“/home/songvm/works/xdn/aoo/libmg/src/mg”
make[2]: 对“uninstall”无需做任何事。
make[2]: 离开目录“/home/songvm/works/xdn/aoo/libmg/src/mg”
make[2]: 进入目录“/home/songvm/works/xdn/aoo/libmg/src”
 ( cd '/tmp/boo/include' && rm -f libmg.h )
 /bin/bash ../libtool   --mode=uninstall rm -f '/tmp/boo/lib/libmg.la'
libtool: uninstall: rm -f /tmp/boo/lib/libmg.la /tmp/boo/lib/libmg-1.0.so /tmp/boo/lib/libmg-1.0.so /tmp/boo/lib/libmg.so /tmp/boo/lib/libmg.a
 ( cd '/tmp/boo/include' && rm -f mg/types.h mg/sequence.h )
make[2]: 离开目录“/home/songvm/works/xdn/aoo/libmg/src”
make[1]: 离开目录“/home/songvm/works/xdn/aoo/libmg/src”
Making uninstall in tests
make[1]: 进入目录“/home/songvm/works/xdn/aoo/libmg/tests”
make[1]: 对“uninstall”无需做任何事。
make[1]: 离开目录“/home/songvm/works/xdn/aoo/libmg/tests”
make[1]: 进入目录“/home/songvm/works/xdn/aoo/libmg”
make[1]: 对“uninstall-am”无需做任何事。
make[1]: 离开目录“/home/songvm/works/xdn/aoo/libmg”
songvm@ubuntu:~/works/xdn/aoo/libmg$ 

关于Makefile.am文件的更多语法,多读一下AUTOCONF、AUTOMAKE、LIBTOOL的说明文档吧!

下一步研究稍复杂的数据结构!!!

标签:libmg,seq,sequence,make,GNU,编译,源码,songvm,works
From: https://blog.csdn.net/gwsong52/article/details/143380977

相关文章

  • Java毕业设计-基于Springboot框架的电子产品销售系统项目实战(附源码+论文)
    大家好!我是岛上程序猿,感谢您阅读本文,欢迎一键三连哦。......
  • Java毕业设计-基于Springboot框架的考试信息报名系统项目实战(附源码+论文)
    大家好!我是岛上程序猿,感谢您阅读本文,欢迎一键三连哦。......
  • java ssm 高校研招信息及专业信息系统 研究生招生信息 源码 jsp
    一、项目简介本项目是一套基于SSM的高校研招信息及专业信息系统,主要针对计算机相关专业的和需要项目实战练习的Java学习者。包含:项目源码、数据库脚本、软件工具等。项目都经过严格调试,确保可以运行!二、技术实现​后端技术:Spring、SpringMVC、MyBatis前端技术:JSP、HTM......
  • java ssm 家具销售线上定制系统 家具商城 网上家居管理 源码 vue
    一、项目简介本项目是一套基于SSM的家具销售线上定制系统,主要针对计算机相关专业的和需要项目实战练习的Java学习者。包含:项目源码、数据库脚本、软件工具等。项目都经过严格调试,确保可以运行!二、技术实现​后端技术:Spring、SpringMVC、MyBatis前端技术:Vue、HTML、CSS......
  • 基于Springboot+Vue的员工考勤管理系统 (含源码数据库)
    1.开发环境开发系统:Windows10/11架构模式:MVC/前后端分离JDK版本:JavaJDK1.8开发工具:IDEA数据库版本:mysql5.7或8.0数据库可视化工具:navicat服务器:SpringBoot自带apachetomcat主要技术:Java,Springboot,mybatis,mysql,vue2.视频演示地址3.功能系统包......
  • 基于安卓Android的自来水收费系统APP(源码+文档+部署+讲解)
    !!!!!!!!!选题不知道怎么选不清楚自己适合做哪块内容都可以免费来问我会持续一直更新下去有问必答一键收藏关注不迷路源码获取:https://pan.baidu.com/s/1aRpOv3f2sdtVYOogQjb8jg?pwd=jf1d提取码:jf1d !!!!!!!!!项目介绍随着智能水务管理的发展和用户对便捷服务的需求增加,一个功能全......
  • SpringBoot社团管理系统9haeo--(程序+源码+数据库+调试部署+开发环境)
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表用户,社长,社团信息,我的社团,社团活动,活动报名开题报告内容一、课题背景随着高校社团活动的蓬勃发展,社团管理成为一项复杂而重要的任务。传统的手工管理方式......
  • 编译和链接
     ⽬录1.翻译环境和运⾏环境2.翻译环境:预编译+编译+汇编+链接1.翻译环境和运⾏环境在ANSIC的任何⼀种实现中,存在两个不同的环境。第1种是翻译环境,在这个环境中源代码被转换为可执⾏的机器指令(⼆进制指令)。第2种是执⾏环境,它⽤于实际执⾏代码2.翻译环......
  • springmvc请求源码流程解析(二)
        Spring官网的MVC模块介绍:SpringWebMVC是基于ServletAPI构建的原始Web框架,从一开始就已包含在Spring框架中。正式名称“SpringWebMVC”来自其源模块的名称(spring-webmvc),但它通常被称为SpringMVC。    从Servlet到SpringMVC:    最典型的MVC就是J......
  • SpringBoot社区养老综合服务平台g57pn--程序+源码+数据库+调试部署+开发环境
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表用户,志愿者,工作人员,社区展示,费用缴纳,房间信息,请假信息,志愿者分配,志愿者任务,工作人员任务,任务完成,工资绩效开题报告内容一、研究背景随着人口老龄化......