建立里3个文件夹
project
|-- AUTHORS
|-- ChangeLog
|-- NEWS
|-- README
|-- include
| |-- funca.h
| `-- funcb.h
|-- src
| |-- funca.c
| `-- funcb.c
`-- test
`-- test.c
其中AUTHORS, ChangeLog, NEWS, README四个文件是手工新建的空文件,里面啥都没有,真实项目写入相应信息即可。
下面是五个程序文件的内容:
//funca.h |
//funcb.h |
//funca.c #include <stdio.h> void funca() { printf("HELLO im function a\n"); return; } |
//funcb.c |
//test.c |
在project主目录,src目录和test分别建立Makefile.am文件,内容如下:
project目录的Makefile.am(注意,库文件要在主文件前面,涉及到makefile的依赖问题,以后讲makefile了再介绍):
SUBDIRS = src test
src目录的Makefile.am:
lib_LTLIBRARIES = libtest.la |
test目录的Makefile.am:
INCLUDES= -I$(top_srcdir)/include |
运行命令$ autoscan 生成文件configure.scan,修改configure.scan,修改后文件内容如下(红色修改,蓝色添加):
# -*- Autoconf -*- |
修改文件完毕后,为文件改名 $ mv configure.scan configure.in
为了偷懒省事,学习网上前辈们的方法,在project目录下新建autogen.sh脚本,内容如下:
#! /bin/sh |
给脚本执行权限 $chmod a+x autogen.sh 后就可以运行脚本 $./autogen.sh生成configure文件了。
生成configure文件后就是 ./configure && make && make install 三步曲(测试的话没有必要make install)。
是不是想知道src目录下文件编译生成的库文件在哪里阿?别急,运行$ ls -a 命令是不是看到有隐藏文件 .libs阿?目录下面的.o文件,动态库和静态库都在里面,甚至连动态库版本号的软链接都给你弄好了,强大的autotools。
这样在不同的电脑上编译出现了不同一些问题
linux@ubuntu:~/auttool$ make
make all-am
make[1]: Entering directory `/home/linux/auttool'
make[1]: Leaving directory `/home/linux/auttool'
在顶层project 文件夹中就make 根本没有有生成我们要的的结果 :test
无奈之下一种很笨的解决方法
进入src 文件夹手动生成 libtest.la
linux@ubuntu:~/auttool/src$ make
/bin/bash ../libtool --tag=CC --mode=compile gcc -DHAVE_CONFIG_H -I. -I.. -g -O2 -MT funca.lo -MD -MP -MF .deps/funca.Tpo -c -o funca.lo funca.c
libtool: compile: gcc -DHAVE_CONFIG_H -I. -I.. -g -O2 -MT funca.lo -MD -MP -MF .deps/funca.Tpo -c funca.c -fPIC -DPIC -o .libs/funca.o
libtool: compile: gcc -DHAVE_CONFIG_H -I. -I.. -g -O2 -MT funca.lo -MD -MP -MF .deps/funca.Tpo -c funca.c -o funca.o >/dev/null 2>&1
mv -f .deps/funca.Tpo .deps/funca.Plo
/bin/bash ../libtool --tag=CC --mode=compile gcc -DHAVE_CONFIG_H -I. -I.. -g -O2 -MT funcb.lo -MD -MP -MF .deps/funcb.Tpo -c -o funcb.lo funcb.c
libtool: compile: gcc -DHAVE_CONFIG_H -I. -I.. -g -O2 -MT funcb.lo -MD -MP -MF .deps/funcb.Tpo -c funcb.c -fPIC -DPIC -o .libs/funcb.o
libtool: compile: gcc -DHAVE_CONFIG_H -I. -I.. -g -O2 -MT funcb.lo -MD -MP -MF .deps/funcb.Tpo -c funcb.c -o funcb.o >/dev/null 2>&1
mv -f .deps/funcb.Tpo .deps/funcb.Plo
/bin/bash ../libtool --tag=CC --mode=link gcc -g -O2 -o libtest.la -rpath /usr/local/lib funca.lo funcb.lo
libtool: link: gcc -shared .libs/funca.o .libs/funcb.o -Wl,-soname -Wl,libtest.so.0 -o .libs/libtest.so.0.0.0
libtool: link: (cd ".libs" && rm -f "libtest.so.0" && ln -s "libtest.so.0.0.0" "libtest.so.0")
libtool: link: (cd ".libs" && rm -f "libtest.so" && ln -s "libtest.so.0.0.0" "libtest.so")
libtool: link: ar cru .libs/libtest.a funca.o funcb.o
libtool: link: ranlib .libs/libtest.a
libtool: link: ( cd ".libs" && rm -f "libtest.la" && ln -s "../libtest.la" "libtest.la" )
在进入文件夹 test:
linux@ubuntu:~/auttool/test$ make
gcc -DHAVE_CONFIG_H -I. -I.. -I../include -g -O2 -MT test.o -MD -MP -MF .deps/test.Tpo -c -o test.o test.c
mv -f .deps/test.Tpo .deps/test.Po
/bin/bash ../libtool --tag=CC --mode=link gcc -g -O2 -o test test.o ../src/libtest.la
libtool: link: gcc -g -O2 -o .libs/test test.o ../src/.libs/libtest.so
目录下出现了要的 test文件
Makefile Makefile.am Makefile.in test test.c test.o