一、背景介绍
在windows环境下为了在Java中使用JNI调用C,需要编译出test.dll动态库,该动态库中使用了静态库,需要将用到的静态库libparams.a、libxml.a编译到动态库中
Makefile.am中
FLAGS 表示用于 C 编译器的选项,
CXXFLAGS 表示用于 C++ 编译器的选项。这两个变量实际上涵盖了编译和汇编两个步骤。
CFLAGS: 指定头文件(.h文件)的路径,如:CFLAGS=-I/usr/include -I/path/include。同样地,安装一个包时会在安装路径下建立一个include目录,当安装过程中出现问题时,试着把以前安装的包的include目录加入到该变量中来。
LDFLAGS:gcc 等编译器会用到的一些优化参数,也可以在里面指定库文件的位置。用法:LDFLAGS=-L/usr/lib -L/path/to/your/lib。每安装一个包都几乎一定的会在安装目录里建立一个lib目录。如果明明安装了某个包,而安装另一个包时,它愣是说找不到,可以抒那个包的lib路径加入的LDFALGS中试一下。
LIBS:告诉链接器要链接哪些库文件,如LIBS = -lpthread -liconv
-Wl,$libparams/lib/libparams.a:通知编译器链接静态库文件
-Wl,-lwsock32:程序汇总需要用到send,htons等wsock32中的库函数,所以需要告知编译器去链接
二、动态库Makefile.am编写
COM_CFLAGS=-Wall -g
COM_LDFLAGS=-Wl,-module -fPIC -shared
modulesdir=$(libdir)
modules_LTLIBARIES=test.la
##1.1 test.{dll,so}
test_la_SOURCES=test.c control.c
test_la_CFLAGS=$(COM_CFLAGS) $(libparams_include) $(libxml_include) -I $(top_srcdir)/../include
test_la_LDFLAGS=$(COM_LDFLAGS)
test_la_LIBADD=$(libparams_lib) $(libxml_lib)
LDFLAGS=-shared -static -Wl,-kill-at
#shared -static -Wl,-kill-at 指定编译成的dll可以被其他程序dlopen
三、configure.in传入Makefile.am中的部分参数
configure.in
#check libparams
AC_ARG_WITH([libparams],
[AS_HELP_STRING([--with-libparams=PATH],[specify prefix directory for installed LIBPARAMS package.])],
[
libparams=$withval
libparams_include="-I$libparams/include"
$host_os in
mingw32*)
libparams_lib="-Wl,$libparams/lib/libparams.a -Wl,-lwsock32";;
linux*)
libparams_lib="-Wl,$libparams/lib/libparams.a -ldl";;
esac
])
#sh脚本中通过调用./configure --with-libparams= 传入参数 ,具体方法可以自行查找automake中的AC_ARG_WITH和AM_CONDITIONAL的用法