我的环境是Ubuntu 14 32位
我分别写了三个名为main.c,foo.c和bar.c的c文件
代码很简单。
第一个源代码是main.c
#include<stdio.h>
extern void foo();
int main(){
foo();
return 0;
}
第二个源代码是foo.c
#include<stdio.h>
void foo(){
printf("Hi,I am foo.");
bar();
}
最后一个是bar.c
#include<stdio.h>
void bar(){
printf("Hi,I am bar.");
}
以上所有文件都放在名为test的文件夹中
(其绝对路径为/ home / jack / Desktop / test)
然后我发出命令:
$ gcc -fPIC -shared -Wl,-soname,libbar.so.1 -o libbar.so.1.0.0 bar.c
$ ln -s libbar.so.1.0.0 libbar.so
$ gcc -fPIC -shared -Wl,-soname,libfoo.so.1 -o libfoo.so.1.0.0 foo.c -lbar -L.
$ ln -s libfoo.so.1.0.0 libfoo.so
$ gcc -c main.c
$ ld -rpath /home/jack/Desktop/test -e main -o main main.o -L. -lfoo -lbar
然后我运行名为main的可执行文件。
$./main
但shell返回以下字符串
bash:./main:没有这样的文件或目录。
但主文件确实存在于当前目录中。
为什么?
答案 0 :(得分:5)
通常,您不应直接调用ld
。相反,您应该使用gcc
来进行链接。 gcc
将一些特殊选项传递给链接器。
如果我修改您的脚本以使用正确的sonames并使用gcc
进行链接,则可以正常工作。我这样做了:
gcc -fPIC -shared -Wl,-soname,libbar.so.1.0.0 -o libbar.so.1.0.0 bar.c
ln -s libbar.so.1.0.0 libbar.so
gcc -fPIC -shared -Wl,-soname,libfoo.so.1.0.0 -o libfoo.so.1.0.0 foo.c -lbar -L.
ln -s libfoo.so.1.0.0 libfoo.so
gcc -c main.c
gcc -Wl,-rpath,$(pwd) -o main main.o -L$(pwd) -lfoo -lbar
直接使用ld
是出于异常情况。不要这样做。那就是说,我不知道你的方法有什么问题。我认为-e
在这里是错误的 - 你不想直接调用main,_start
做其他事情。查看ldd
的输出显示了两种方法之间的一些重要差异。使用gcc -v
调用链接会向您展示幕后发生的事情,以防您想了解更多内容。
答案 1 :(得分:2)
val vertexRDD: org.apache.spark.rdd.RDD[(VertexId, Array[Int])] val clusters = vertexRDD.takeSample(false, 3) val clustersRDD: RDD[(VertexId, Array[Int])] = sc.parallelize(clusters) val final = vertexRDD.subtract(clustersRDD) final.collect().foreach(println(_))
但主文件确实存在于当前目录中。
为什么?
可执行文件需要合适的程序解释器才能执行动态链接。打印bash: ./main: no such file or directory.
消息是因为无法找到错误的默认解释器。
使用no such file or directory
选项ld
(对于32位)进行设置。
64位动态链接器为-dynamic-linker /lib/ld-linux.so.2
。
由于您的输入是直接/lib64/ld-linux-x86-64.so.2
,因此您必须在main
结束时致电exit(0)
。它不能从main返回,因为没有人调用它。指令指针由内核直接设置为main
的地址。从main
返回可能会导致段错误,因为您没有向printf添加main
,所以无法看到消息。