当前位置:首页 » 编程软件 » 编译通过动态库加载失败

编译通过动态库加载失败

发布时间: 2024-08-02 21:26:28

A. WIN7 64位 下VS2015编译通过,但是无法启动程序 提示 WinTab32.dll 已经加载但是找不到入口点怎么办

方法/步骤

1、通常在运行中注册动态库文件:regsvr32 msi.dll (按回车键执行命令)都能顺利通过。

2、但也有出错提示:
模块“xxx.dll”已加载,但找不到入口点DLLRegisterServer
请确保xxx.dll为有效的DLL或OCX文件,然后重试。

3、这就要看当前是单个动态链文件不能注册,还是所有的文件都是注册无效。如果是单个文件注册无效,那就是这个动态链文件有问题,找到相同的操作系统(32位或者64位)相应的路径中,复制一个(网上下载也行),保存到自己的操作系统中即可。64位操作系统的路径是:C:\Windows\System32 文件夹内。

4、如果是64位的操作系统,那么提取、保存正确的32位动态链文件的路径是:
C:\Windows\SysWOW64 文件夹内。

5、如果所有的动态链文件注册都无效,那就是当前的操作系统无权限。可以加载权限注册即可。步骤如下:
开始→所有程序→附件→右键点击命令提示符(CMD)→以管理员身份运行。

6、然后,再使用命令注册: regsvr32 msi.dll
提示:可以先复制命令,再点击左上角,在弹出来的菜单中点选编辑→粘贴命令。

7、注册成功之后会有提示。

8、也可以将绝对路径添加上去(先去该路径查找是否有这个动态链文件):
regsvr32 C:\Windows\SysWOW64\msi.dll

9、最后,注意命令参数的应用,有时候需要先解除注册,之后再注册才可以。
1右键添加以管理员身份运行。

B. 关于linux下连接动态库问题

gcc编译时,当使用动态库编译可以按照几种写法
1.gcc test.c ./libSDL2-2.so
2.gcc test.c -lSDL2-2
3.gcc test.c -L/home/test -lSDL2-2
一般的编译参数都是按照2或3去写
2写法的含义是从/lib或者/usr/lib目录下寻找名称为SDL2-2的库,即寻找/lib/libSDL2-2.so或者/usr/lib/libSDL2-2.so文件进行链接,当然如果没有动态库就会去找静态库,再没有应该就会在编译时报错
3写法的含义是从-L参数首先从指定的目录中寻找需要链接的库文件,随后再去寻找系统文件夹中是否存在需要的库
1写法的含义是将当前目录下的./libSDL2-2.so.0文件链接进最终文件,因此执行readelf -a a.out后在动态库部分所看到的路径就是./libSDL2-2.so.0,进而在执行文件时仅会从当前目录下寻找libSDL2-2.so.0文件,当执行文件时所在的目录下没有该文件时就会出现找不到库文件的操作

你第二次操作时,因为function.so库文件与a.out文件在同一个目录,同时也是在该目录下执行的ldd操作及运行a.out,a.out在加载动态库时从当前目录下找到了所需要的库文件,此时能够执行成功(ldd命令实质是一个脚本,通过设置环境变量运行动态库链接器来输出所有待链接的动态库)。
你可以试试将a.out拷贝至其他目录再次运行,将出现和第一次操作时一样的现象,找不到function.so文件。

具体的解决方法就是修改编译参数,将./libSDL2-2.so.0修改为-lSDL2-2并将libSDL2-2.so.0文件拷贝至/usr/lib目录下,并且可能因为没有修改链接器的缓存文件(将可能找不到带版本号后缀的动态库),需要在/usr/lib目录下建立一个文件连接(ln -s libSDL2-2.so.0 libSDL2-2.so)或者直接修改名称为libSDL2-2.so

C. 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

D. gcc编译指定了库路径,但是还是找不到

不同版本的动态库是为了升级方便,旧的程序需要与旧的库链接,新的程序与新的. 一般的做法是把libabc.so连接(symbolic link, ln -s libabc.so.N libabc.so)到最新的版本,这样以后的新程序,在用gcc -labc的时候,都会链接到新的版本

E. 缺少动态库的情况下,能通过编译吗

>> 如果你是链接动态库,在GCC后跟了一个-l参数,其后就是你所需库的名称,
>> 那么你不仅需要那个你所需的库文件,还需要你所需库的头文件才行,编译时需要头文件支持,
>> 链接时需要库文件,不管你是动态还是静态编译都是如此!!!!
头文件不是必须的。只要没有出现未声明的函数/变量的调用就可以。

>> 还需说明的一点是:只有用参数-o时才会有那个-satic的选项,
>> 也就是说只有在链接程序时才会有动态链接和静态链接之分!!!!!!
没有 -o 也可以 -static。-o 不代表链接

>> 动态链接库是为了减少可执行文件的大小,就是在一个系统中只提供一个库,
>> 可供多个动态链接的程序共同使用
同时也避免库代码被重复加载进入内存,减少系统内存占用

热点内容
以巧克力为主写一篇脚本 发布:2024-11-25 17:16:59 浏览:334
数据库课时 发布:2024-11-25 16:57:50 浏览:450
dns服务器名称地址 发布:2024-11-25 16:57:49 浏览:931
如何给监控加访问密码 发布:2024-11-25 16:45:13 浏览:600
国外安卓音乐播放器哪个好 发布:2024-11-25 16:35:58 浏览:142
我的世界服务器增加粒子 发布:2024-11-25 16:28:29 浏览:717
带内核的安卓x86是什么意思 发布:2024-11-25 16:27:01 浏览:272
php了解 发布:2024-11-25 16:16:26 浏览:933
个人搭建服务器要钱不 发布:2024-11-25 16:06:56 浏览:832
服务器磁盘满了怎么办 发布:2024-11-25 16:06:14 浏览:19