2017-05-25 56 views
0

您好我试着做静态库,并与GNU编译器的共享库,这里是下面的代码Couldnot执行动态链接程序

以下是该库 calc_mean.c

double mean(double a, double b){ 
return (a+b)/2; 
} 

代码以下是我的头文件calc_mean.h

double mean(double,double); 

现在我开始创建使用下面的命令静态库

第一,calc_mean.c变成目标文件

gcc -c calc_mean.c -o calc_mean.o 
秒,归档器(AR)被调用来产生静态 库(命名libmean.a)从对象文件calc_mean的。 ø

ar rcs libmean.a calc_mean.o 

第三,创建的共享库之前,使用-fPIC选项 创建一个独立的代码所必需的共享库

gcc -c -fPIC calc_mean.c -o calc_mean.o 

现在使用下面的命令行创建的共享库

gcc -shared -Wl,-soname,libmean.so.1 -o libmean.so.1.0.1 calc_mean.o 

使用该库是如下

#include <stdio.h> 
#include "calc_mean.h" 

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

double v1,v2,m; 
v1 = 5.2; 
v2 = 7.9; 
m=mean(v1,v2); 
printf("The mean of %3.2f and %3.2f is %3.2f\n",v1,v2,m); 
return 0; 
} 

最后我挂的程序对静态库终于我的main.c文件生成一个静态链接文件

gcc -static main.c -L. -lmean -o statically_linked 

当动态链接时,它属泰德用下面的命令

gcc main.c -o dynamically_linked -L. -lmean 

现在,当我使用命令使用下面的命令来执行动态链接程序,荫收到错误消息,说LD_LIBRARY不被识别为内部或外部命令dynamically_linked.exe,可操作的程序或批处理文件

LD_LIBRARY_PATH=.D:\c\project3./dynamically_linked 

我该如何执行动态链接程序?

回答

0

您的最后一行建议您在Windows上执行所有操作。但是你似乎已经遵循了Linux或其他* nix平台的一步一步指南。

在windows上,动态链接库的格式为.dll(不是.so),并且没有版本约定,因此创建共享库的命令看起来有点不同。

相反的:

gcc -shared -Wl,-soname,libmean.so.1 -o libmean.so.1.0.1 calc_mean.o 

做窗户下面:

gcc -shared -Wl,--out-implib,libmean.dll.a -o mean-1.dll calc_mean.o 

这将创建一个名为本身的mean-1.dll库,以及一个名为libmean.dll.a导入库。在windows平台上的导入库(有时称为.lib而不是.dll.a)仅仅是链接程序时使用的存根,AFAIK MinGW并不需要它,但其他编译器可以。

将您的主程序则应该使用相同的命令工作:

gcc main.c -o dynamically_linked -L. -lmean 

而且在Windows找到.dll库,没有LD_LIBRARY_PATH - 窗口只是看起来他们在标准的搜索路径,包括需要它的.exe的目录。 IOW,你应该能够运行你的程序。

+0

是的它的工作..谢谢你得到它,我可以保持calc_mean.c和calc_mean.h在不同的文件夹,其中main.c不位于并且想要使库和链接到另一个文件夹中main.c,它会运行吗?顺便说一句,我是一名初学者。 – jenny

+0

只要在编译期间使用'-I'标志传递正确的包含路径,就可以保留头文件('.h')。同样,您可以在任何地方保留(导入)库,只需在链接期间使用'-L'标志传递正确的库搜索路径即可。 –

+0

是啊好吧...... – jenny