链接mono静态库注意事项

起因

在 链接mono静态库,执行c#程序 中,通过gcc编译生成pack.exe.通过pack.exe加载hello.exe(cshap程序集).mono自带工具中有个叫mkbundle.可以把.Net 程序集嵌入到Native程序中.里面会将.Net 程序集进行压缩.今天在其他机器执行的时候发现无法执行这个exe.发现有一个依赖的动态库zlib(或者叫libz).

zlib

在运行程序的时候,弹出提示.
缺少zlib.dll动态库
编译命令为:
#指定链接libz和libiconv
gcc -o qiufeng-pack.exe qiufeng-pack.c -lz -liconv  -Wint-to-pointer-cast -Wint-to-pointer-cast -Wincompatible-pointer-types -g

为什么还会这样的提示呢?通过PETool工具查看倒入表.看到程序中的确依赖这两个动态库.

程序依赖zlib.dll,看到所用的函数

推测是gcc 在链接 -lz,可能是链接libz.dll.a,所以才需要依赖zlib.dll.

试试显式指定链接静态库.看看如何.

#-Wl,-Bstatic 指定后边库为静态链接
gcc -o qiufeng-pack.exe qiufeng-pack.c  -Wint-to-pointer-cast -Wint-to-pointer-cast -Wincompatible-pointer-types -g -Wl,-Bstatic -lz -liconv

在这样编译之后,果真在导入表中看不到依赖zlib.dll和libincon.dll这两个动态库.

libiconv

为什么要用到这个库,这个库主要是进行编码转换的.windows 10以前的系统中文默认为gbk,如果想在Windows 7执行的,就得进行编码转换. 早前在这边篇 linux编码转换 ,使用iconv,但Windows 10没有执行成功.才想起Windows 10默认编码就是utf-8.才测试成功.在详细说iconv使用问题.
秋风 2019-08-12