Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/css/36.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 无法执行动态链接的程序_C_Cmd - Fatal编程技术网

C 无法执行动态链接的程序

C 无法执行动态链接的程序,c,cmd,C,Cmd,嗨,我试着用gnu编译器实现静态库和共享库,下面是代码 以下是该库的代码 计算平均值 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 其次,调用archiver(ar)以生成静态 对象文件ca

嗨,我试着用gnu编译器实现静态库和共享库,下面是代码

以下是该库的代码 计算平均值

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
其次,调用archiver(ar)以生成静态 对象文件calc_mean.o中的库(名为libmean.a)

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
最后,我使用该库的主.c文件如下

#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;
 }
动态链接时,它使用以下命令生成一个动态链接的.exe

gcc main.c -o dynamically_linked -L. -lmean
现在,当我使用以下命令执行动态链接程序时,我收到一条错误消息,说LD_LIBRARY未被识别为内部或外部命令、可操作程序或批处理文件

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

如何执行动态链接程序?

您的最后一行建议您在windows上执行所有这些操作。但您似乎遵循了linux或其他*nix平台的分步指南

在windows上,动态链接库采用
.dll
格式(而不是
.so
),并且没有版本控制约定,因此创建共享库的命令看起来应该有些不同

而不是:

gcc -shared -Wl,-soname,libmean.so.1 -o libmean.so.1.0.1 calc_mean.o
在windows上执行以下操作:

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\u LIBRARY\u路径
——windows只是在标准搜索路径中查找它们,包括需要它的
.exe
目录。瞧,你应该可以运行你的程序。

是的,它起作用了。。谢谢,我能把calc_mean.c和calc_mean.h放在main.c不在的不同文件夹中吗?我想建立库并将它们链接到另一个文件夹中的main.c,它会运行吗?顺便说一句,我是初学者。您可以在任何地方保留标题(
.h
),只需在编译期间使用
-I
标志传递正确的包含路径即可。同样,您可以在任何地方保留(导入)库,只需在链接过程中使用
-L
标志传递正确的库搜索路径。@jenny很高兴它对您有用。顺便说一句,你知道你能找到解决问题的答案吗?这给了答案的作者一些声誉(也给了自己一点声誉),更重要的是,让后来的读者一眼就能看出这个解决方案是有效的。当然你不需要这样做:)哦,是的。。我以前不知道,是的,它是互利的D
gcc main.c -o dynamically_linked -L. -lmean