链接静态库生成dll动态的的Makefile.am

一、背景介绍

在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的用法




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值