编译连接库
㈠ 动态库链接编译
这里的动态的意思应该是模块代码是动态加载的
而不是随着应用程序一起编译
只要动态库里的函数接口不变
应用程序就无需重新编译
只需将动态库重新编译后替换掉旧的动态库即可
如果动态库的函数接口有变动
那么应用程序就要重新编译发布
这也是我的个人理解~~~
㈡ 易语言 编译动态链接库时至少必须提供一个被公开的子程序。
来张图片
选中即可,一个dll文件内至少有1个或1个以上公开的子程序,如果没公开的则其他程序无法调用。
㈢ 动态链接,静态链接 动态编译,静态编译 动态链接库,静态链接库 这些两两间的区别是什么呢
有点儿乱……,分数少简单扼要的说说吧。
————————————
首先,传统的编译,也就是静态编译是把 源文件 翻译成目标文件,这个是一次性过程,也就是你所谓的静态编译。
后来的Java和.NET等语言,首先编译成中间形式,然后运行过程中根据需要编译成本地代码(注意这个过程不是一次性的,下次运行重新编译),这个就是JIT(即时编译)技术,从即时编译发展出了动态编译技术
————————————
(传统的)编译完成后,像C/C++、Fortran、汇编等语言,可以把多个目标文件合并到一个库文件中,这个就是静态库。比如常说的库函数printf就是libc里面的函数。
如果有了启动函数(main),main里面使用了printf,就可以通过静态链接技术,从libc中提取出printf所在的文件加入到可执行文件中,如果printf还需要其它函数,就继续搜索并加入列表,直到形成一个闭包。这个就是静态链接。
可是静态链接有个明显的缺点,如果每个程序都需要printf,那么printf这个函数的代码就会同时存在在每个程序中,这样也太占地方了吧。所以发明了动态连接技术,其实有两种形式。无论哪一种,都是首先记录下需要调用printf这个函数以及所在的动态库,等到运行的时候再加载动态库,从动态库中找到真正的printf去执行。
由于,动态链接技术需要一些额外的信息,传统的静态库是不具备的,这些额外信息主要是重复加载和卸载时所需要的一些代码,因此需要动态链接库。
㈣ 如何编译 opencv动态链接库
在一个项目中需要用到OpenCV,刚开始使用了OpenCV的动态链接库,这样,在移动可执行程序时还必须将OpenCV动态支持库一起搬移,很是麻烦。所以,最终选择OpenCV静态链接库,这样程序移植运行就方便了很多。
需要编译成静态库以便于应用程序链接。
网上有的教程中写的在VC++2010下安装OpenCV2.1时用到了TBB库,而我在编译链接自己的程序后需要用到TBB.dll。本人设计的目的就是要做一个独立的界面程序,不需要携带其他第三方库。经过一段时间的努力最终找到了编译OpenCV2.1静态库的方法。
㈤ 在windows下如何通过命令行完成C++工程的编译、链接、生成,如果需要链接系统自带的动态链接库怎么办
没啥具体要求的话,直接往上堆就行了
cl hello.cpp yourlib.lib
需要更多的控制,查看 cl /? 吧,也可以查 MSDN
===
其他编译器也类似,简单情况可以直接堆文件名
====
library 文件不在默认的搜索路径里的话,一般有两种方法解决:
1 gcc 的话,使用 -L/path/to/lib
2 直接用全路径来写,编译命令上加 /path/to/lib/file
比如
gcc -o hello.exe hello.c C:\xxx\msimg32.lib
另:.h 文件不应该出现在编译命令里,编译单元是按一个源码文件 .c/.cpp 来算的
===========================
隐式链接DLL,链接时使用的是对应的 implib,一般也是以 .lib 文件存在
而 GCC(MinGW) 的话,扩展名为 .a
msimg32 的话,/MinGW/lib 已经有 libmsimg32.a 文件,可以直接加 -lmsimg32 选项来链接
=======
至于资源文件的话,MinGW 中用的编译器是 windres.exe
命令为:windres -i xx.rc -o xx.res -O coff
然后链接成 exe 时加上 xx.res 文件名
=====================
makefile 其实就是便于组织编译命令,实际使用的编译命令还是需要自己写的
㈥ 请教一个cmake编译链接库的问题
把工程C中的LINK_LIBRARIES(AAA BBB)这一行改成TARGET_LINK_LIBRARIES(CCC BBB AAA)并且放在最后一行就行了。
㈦ C++ 怎么编译 ARMV4T 的链接库
恩、、不是这个问题导致的,先用C++的静态调用试试看,如果路径没问题那建议你好好查查dll写的是否正确。
对了,最好用VC6的Depends检查一下,因为我碰到过自己写的函数名在生成dll之后函数名前面出现了随机的乱码,这样你调用的函数名就得包括那些乱码了
㈧ 如何用gcc编译生成动态链接库*.so文件
生成动态链接库的命令行为:
gcc -fPIC -shared -o libstr.so
当将main.c和动态链接库进行连接生成可执行文件 的命令如下:
gcc main.c -L./ -lstr -o main或者gcc -o main main.c -L./ -lstr
测试是否动态链接,如果列出libstr.so, 那么应该是连接正常了ldd main注:1)-L.:表示连接的库在当前的目录中。
㈨ 有个 c 文件,如何才能将其编译成动态链接库
有二个文件,一个 test.h, 一个 test.c
//test.h
#pragmaonce
#ifdef__cplusplus
extern"C"{
#endif
intadd(inta,intb);
#ifdef__cplusplus
}
#endif
//test.c
#include"test.h"
intadd(inta,intb)
{
returna+b;
}
编译,生成动态链接库:
#gcc-g3-Wall-fPIC-shared-olibtest.sotest.c
#ls-l
-rwxr-xr-x1rootroot14618Jul2413:44libtest.so
-rw-r--r--1rootroot63Jul2413:43test.c
-rw-r--r--1rootroot106Jul2413:43test.h
#nmlibtest.so
00000000002006e8a_DYNAMIC
0000000000200890a_GLOBAL_OFFSET_TABLE_
w_ITM_deregisterTMCloneTable
w_ITM_registerTMCloneTable
w_Jv_RegisterClasses
00000000002006c8d__CTOR_END__
00000000002006c0d__CTOR_LIST__
00000000002006d8d__DTOR_END__
00000000002006d0d__DTOR_LIST__
00000000000006b8r__FRAME_END__
00000000002006e0d__JCR_END__
00000000002006e0d__JCR_LIST__
00000000002008b8d__TMC_END__
00000000002008b8A__bss_start
w__cxa_finalize@@GLIBC_2.2.5
0000000000000620t__do_global_ctors_aux
0000000000000550t__do_global_dtors_aux
00000000002008b0d__dso_handle
w__gmon_start__
00000000002008b8A_edata
00000000002008c8A_end
0000000000000658T_fini
0000000000000468T_init
0000000000000600Tadd
00000000000004a0tcall_gmon_start
00000000002008b8bcompleted.6557
00000000000004c0tderegister_tm_clones
00000000002008c0bdtor_idx.6559
00000000000005d0tframe_mmy
0000000000000500tregister_tm_clones