GCC动态链接库和静态库

利用MinGW,针对前一篇文章(C++继承与引用 )中的例子,可以生成动态链接库。
生成DLL:g++ -D"TEST_EXPORTS" -shared -o libtest.dll test.cpp
利用该dll生成exe:g++ -D"TEST_IMPORTS" T.cpp -l"libtest" -L .
这样会生成a.exe,依赖于libtest.dll。命令中-l"libtest"使用l"test"也是一样的效果。如果没有-D"TEST_IMPORTS",则会报告两个Info:
Info: resolving test::test_int      by linking to __imp___ZN4test8test_intE (auto-import)
Info: resolving vtable for test::test by linking to __imp___ZTVN4test4testE (auto-import)
因此在Windows平台下就算是用GCC编译得到动态库,也最好是编译时将应该添加的导入导出的宏加上,与使用VC一样,使用__specdecl(dllexport)这些。虽然从结果来看即使没有这些标记也没有任何问题。
使用GCC编译得到的Dll不宜动态链接进VC编译的程序中,因为他没有提供VC需要的lib文件。
对于一个简单的C程序:
//tt.h
void print();

//tt.c
#include <stdio.h>
#include "tt.h"
void print()
{
printf("你好 in tt.c/n");
}

//ttt.c
#include "tt.h"

int main(int argc, char *argv[])
{
print();

return 0;
}

使用:gcc -shared -o libtt.dll tt.c   生成libtt.dll;
使用:gcc ttt.c -l"tt" -L . -o ttt    生成ttt.exe。

接下来谈谈生成静态库,及其链接:
首先将tt.c编译为.o文件:gcc -c tt.c -o tt.o
然后利用ar命令将.o文件生成静态库.a文件:ar cqs libt3.a tt.o
然后链接静态库编译为exe程序:gcc ttt.c -o t3.exe -L"." -lt3
生成的t3.exe比ttt.exe稍大,但是考虑到ttt.exe还带了一个dll,t3就小多了。当然这个比较纯属无聊。
另外,生成的.a文件,改名为.lib文件也可以,利用VC的cl命令链接.a或者.lib都行,都能够得到正确的exe程序。
当然,使用VC的lib命令也可以把GCC生成的.o文件转换为.lib文件,使用ar命令可以将cl编译的.obj转换为.a或者.lib文件。
虽然GCC这里生成的.a和.lib都能使用,但是动态库时如果生成.so好像是不行的。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值