导航:首页 > 源码编译 > 编译动态库怎么知道加什么lib

编译动态库怎么知道加什么lib

发布时间:2025-02-26 17:26:33

Ⅰ c++动态库编写

1.DLL的隐式调用
隐式链接采用静态加载的方式,比较简单,需要.h、.lib、.dll三件套。新建“控制台应用程序”或“空项目”。配置如下:
项目-属性-配置属性-VC++ 目录- 在“包含目录”里添加头文件testdll.h所在的目录
项目-属性-配置属性-VC++ 目录- 在“库目录”里添加头文件testdll.lib所在的目录
项目-属性-配置属性-链接器-输入- 在“附加依赖项”里添加“testdll.lib”(若有多个 lib 则以空格隔开) 。 //你也可以在代码中添加一行设置库的链接,#pragma comment(lib, "DLLSample.lib")
库文件头文件等目录设置,本文将库文件及头文件拷贝到工程目录下DLL文件夹
添加LIB依赖项
调用的源程序#
// callmyDLL.cpp : 定义控制台应用程序的入口点。
//包含头头文件,函数声明
#include "stdafx.h"
#include "stdlib.h"
#include "myDLL.h"
int _tmain(int argc, _TCHAR* argv[])
{
//这是通过上节的extern方式调用的
int z= Add(1,2);
//也可以通过类导出的方式调用
//CmyDll dll;
//int z = dll.Add(1,2);
printf("z is:%d\n", z);
system("pause");
return 0;
}
以上如果包含目录、库目录、库的依赖项都没有问题就可以生成成功了
#运行时最后一步:将动态库文件拷贝到可执行文件目录下,否则会出现如下错误。
如何没有设置lib目录和依赖项,可以在代码中添加以下一行代码也可以生成成功
// callmyDLL.cpp : 定义控制台应用程序的入口点。
//包含头头文件,函数声明
#include "stdafx.h"
#include "stdlib.h"
#include "myDLL.h"
#prama comment(lib, "myDll.lib")
//此时的myDll.lib的路径必须能找到的,可以给定一个全路径如:“c:\\myDll.lib”
int _tmain(int argc, _TCHAR* argv[])
{
int z= Add(1,2);
printf("z is:%d\n", z);
system("pause");
return 0;
}
所以通过设置依赖项和库目录和添加#Prama是具有相同效果的,如果有问题,得检查是否两者的生成平台不同(如win32和x64)或者一个是Debug一个是release
2、DLL显示调用
对于显示连接,即动态加载我们需要调用LoadLibrary
在MSDN中:HMODULE WINAPI LoadLibrary(
__in LPCTSTR lpFileName
);
它的功能是映射一个可执行模块到调用进程的地址空间。由此我们知道显示调用就是函数指针来调用函数。
Steps:
1、声明头文件windows.h,说明我想用windows32方法来加载和卸载DLL
2、然后用typedef定义一个指针函数类型.typedef void(*fun) //这个指针类型,要和你调用的函数类型和参数保持一致
3、定一个句柄实例,用来取DLL的实例地址。HINSTANCE hdll;
格式为hdll=LoadLibrary(“DLL地址”);这里字符串类型是LPSTR,当是unicode字符集的时候会不行,
因此要在配置-属性-常规里面把默认字符集“unicode”改成支持多字符扩展即可。
4、取的地址要判断,返回的句柄是否为空,如果为无效句柄,那么要释放加载DLL所占用的内存。
5、定义一个函数指针,用来获取你要用的函数地址。
然后通过GetProcAdress来获取函数的地址,参数是DLL的句柄和你要调用的函数名:比如:FUN=(fun)GetProcAdress(hdll,"sum");
这里也要判断要函数指针是否为空,如果没取到要求的函数,那么要释放句柄。
6、然后通过函数指针来调用函数。
7、调用结束后,就释放句柄FreeLibrary(hdll);
直接上代码,一一一一一目了然
// callDLLSee.cpp : 定义控制台应用程序的入口点。
//通过调用windowsAPI 来加载和卸载DLL
#include "stdafx.h"
#include "Windows.h"
typedef int(*Dllfun)(int , int);
int _tmain(int argc, _TCHAR* argv[])
{
Dllfun funName;
HINSTANCE hdll;
//put DLL under the Debug path
//use _T 设置为宽字符
hdll = LoadLibrary( _T("myDLL.dll"));
if (hdll == NULL)
{
FreeLibrary(hdll);
}
funName = (Dllfun)GetProcAddress(hdll, "Add");
if (funName == NULL)
{
FreeLibrary(hdll);
}
int x = 1, y = 10;
double z= funName(r, h);
printf("z= %d\n", z);
FreeLibrary(hdll);
return 0;
}

Ⅱ (linux)动态链接库找不到路径

ld.so.conf只是在编译时查找动态库的路径;

运行时动态库的查找路径默认在/usr/lib和/lib,所以找不到
可以设置LD_LIBRARY_PATH=/usr/local/ma(你动态库的所在目录)
或者把动态库拷贝到/usr/lib或/lib下

Ⅲ 用arm-linux交叉编译器使用动态库时搜索标准路径是什么

你可以试着加--verbose选项,可以看到它的搜索路径。
如果你有根文件系统,那么通过指定--sysroot=dir,他会在默认的搜索路径之前加上一个dir,在这些地方找;
还可以额外使用-Ldir来添加搜索路径。

Ⅳ C++中lib 和 dll 的区别,生成以及使用详解

首先介绍一下静态库(静态链接库)、动态库(动态链接库)的概念,首先两者都是代码共享的方式。
静态库:在链接步骤中,连接器将从库文件取得所需的代码,复制到生成的可执行文件中,这种库称为静态库,其特点是可执行文件中包含了库代码的一份完整拷贝;缺点就是被多次使用就会有多份冗余拷贝。即静态库中的指令都全部被直接包含在最终生成的 EXE 文件中了。在vs中新建生成静态库的工程,编译生成成功后,只产生一个.lib文件
动态库:动态链接库是一个包含可由多个程序同时使用的代码和数据的库,DLL不是可执行文件。动态链接提供了一种方法,使进程可以调用不属于其可执行代码的函数。函数的可执行代码位于一个 DLL 中,该 DLL 包含一个或多个已被编译、链接并与使用它们的进程分开存储的函数。在vs中新建生成动态库的工程,编译成功后,产生一个.lib文件和一个.dll文件
那么上述静态库和动态库中的lib有什么区别呢?
静态库中的lib:该LIB包含函数代码本身(即包括函数的索引,也包括实现),在编译时直接将代码加入程序当中
动态库中的lib:该LIB包含了函数所在的DLL文件和文件中函数位置的信息(索引),函数实现代码由运行时加载在进程空间中的DLL提供
总之,lib是编译时用到的,dll是运行时用到的。如果要完成源代码的编译,只需要lib;如果要使动态链接的程序运行起来,只需要dll。

Ⅳ 哪个命令可以查看.lib或.so文件

ldd 查看可执行文件链接了哪些 系统动态链接库
nm 查看可执行文件里面有哪些符号
strip 去除符号表可以给可执行文件瘦身
如果我们想从可执行程序里面提取出来一点什么文本信息的话,还可以用strings命令
strings

Linux操作系统上面的动态共享库大致分为三类:
1、操作系统级别的共享库和基础的系统工具库
比方说libc.so, libz.so, libpthread.so等等,这些系统库会被放在/lib和/usr/lib目录下面,如果是64位操作系统,还会有/lib64和/usr /lib64目录。如果操作系统带有图形界面,那么还会有/usr/X11R6/lib目录,如果是64位操作系统,还有/usr/X11R6 /lib64目录。此外还可能有其他特定Linux版本的系统库目录。
这些系统库文件的完整和版本的正确,确保了Linux上面各种程序能够正常的运行。
2、应用程序级别的系统共享库
并非操作系统自带,但是可能被很多应用程序所共享的库,一般会被放在/usr/local/lib和/usr/local/lib64这两个目录下面。很多你自行编译安装的程序都会在编译的时候自动把/usr/local/lib加入gcc的-L参数,而在运行的时候自动到/usr/local /lib下面去寻找共享库。
以上两类的动态共享库,应用程序会自动寻找到他们,并不需要你额外的设置和担心。这是为什么呢?因为以上这些目录默认就被加入到动态链接程序的搜索路径里面了。Linux的系统共享库搜索路径定义在/etc/ld.so.conf这个配置文件里面。这个文件的内容格式大致如下:

/usr/X11R6/lib64
/usr/X11R6/lib
/usr/local/lib
/lib64
/lib
/usr/lib64
/usr/lib
/usr/local/lib64
/usr/local/ImageMagick/lib
假设我们自己编译安装的ImageMagick图形库在/usr/local/ImageMagick目录下面,并且希望其他应用程序都可以使用 ImageMagick的动态共享库,那么我们只需要把/usr/local/ImageMagick/lib目录加入/etc/ld.so.conf文件里面,然后执行:ldconfig 命令即可。
ldcofig将搜索以上所有的目录,为共享库建立一个缓存文件/etc/ld.so.cache。为了确认ldconfig已经搜索到ImageMagick的库,我们可以用上面介绍的strings命令从ld.so.cache里面抽取文本信息来检查一下:

strings /etc/ld.so.cache | grep ImageMagick

输出结果为:

/usr/local/ImageMagick/lib/libWand.so.10
/usr/local/ImageMagick/lib/libWand.so
/usr/local/ImageMagick/lib/libMagick.so.10
/usr/local/ImageMagick/lib/libMagick.so
/usr/local/ImageMagick/lib/libMagick++.so.10
/usr/local/ImageMagick/lib/libMagick++.so
已经成功了!
3、应用程序独享的动态共享库
有很多共享库只被特定的应用程序使用,那么就没有必要加入系统库路径,以免应用程序的共享库之间发生版本冲突。因此Linux还可以通过设置环境变量LD_LIBRARY_PATH来临时指定应用程序的共享库搜索路径,就像我们上面举的那个例子一样,我们可以在应用程序的启动脚本里面预先设置 LD_LIBRARY_PATH,指定本应用程序附加的共享库搜索路径,从而让应用程序找到它。

Ⅵ linux 静态库和动态库编译的区别

Linux库有动态与静态两种,动态通常用.so为后缀,静态用.a为后缀。例如:libhello.so libhello.a
为了在同一系统中使用不同版本的库,可以在库文件名后加上版本号为后缀,例如: libhello.so.1.0,由于程序连接默认以.so为文件后缀名。所以为了使用这些库,通常使用建立符号连接的方式。
ln -s libhello.so.1.0 libhello.so.1
ln -s libhello.so.1 libhello.so

动态库和静态库的区别:
当要使用静态的程序库时,连接器会找出程序所需的函数,然后将它们拷贝到执行文件,由于这种拷贝是完整的,所以一旦连接成功,静态程序库也就不再需要了。然而,对动态库而言,就不是这样。动态库会在执行程序内留下一个标记‘指明当程序执行时,首先必须载入这个库。由于动态库节省空间,linux下进行连接的缺省操作是首先连接动态库,也就是说,如果同时存在静态和动态库,不特别指定的话,将与动态库相连接。

两种库的编译产生方法:
第一步要把源代码编绎成目标代码。以下面的代码hello.c为例,生成hello库:

/* hello.c */
#include
void sayhello()
{
printf("hello,world\n");
}
用gcc编绎该文件,在编绎时可以使用任何全法的编绎参数,例如-g加入调试代码等:
gcc -c hello.c -o hello.o
1.连接成静态库
连接成静态库使用ar命令,其实ar是archive的意思
$ar cqs libhello.a hello.o
2.连接成动态库
生成动态库用gcc来完成,由于可能存在多个版本,因此通常指定版本号:
$gcc -shared -Wl,-soname,libhello.so.1 -o libhello.so.1.0 hello.o
另外再建立两个符号连接:
$ln -s libhello.so.1.0 libhello.so.1
$ln -s libhello.so.1 libhello.so
这样一个libhello的动态连接库就生成了。最重要的是传gcc -shared 参数使其生成是动态库而不是普通执行程序。
-Wl 表示后面的参数也就是-soname,libhello.so.1直接传给连接器ld进行处理。实际上,每一个库都有一个soname,当连接器发现它正在查找的程序库中有这样一个名称,连接器便会将soname嵌入连结中的二进制文件内,而不是它正在运行的实际文件名,在程序执行期间,程序会查找拥有 soname名字的文件,%B

阅读全文

与编译动态库怎么知道加什么lib相关的资料

热点内容
波特率算法 浏览:792
单片机为什么要引入补码 浏览:202
javascript权威编程指南 浏览:334
pdf机长 浏览:378
五十音图pdf 浏览:865
什么叫下架服务器 浏览:111
pdf分辨率查看 浏览:15
如何将word转pdf 浏览:186
我的世界ec服务器怎么调配置 浏览:259
单片机换标 浏览:595
语音系统和方舟编译器哪个好 浏览:316
html用什么编译器显示 浏览:185
程序员打印系统 浏览:73
安装系统端口和服务器地址怎么看 浏览:263
编译指针 浏览:410
用于解压房款的担保协议 浏览:674
程序员补班 浏览:566
组件编译语言 浏览:817
c文件夹怎么复制 浏览:968
linux统计ip流量 浏览:999