gcc-c和ld:exec没有这样的文件或目录

gcc-c和ld:exec没有这样的文件或目录,c,gcc,ld,C,Gcc,Ld,我知道这是一个非常基本的问题,但当我发现类似的问题时,我没有找到解决方案 我对这个简单的程序也有同样的问题: #include <stdio.h> void main() { printf("Hi\n"); fflush(stdout); } 有人知道怎么回事吗?是环境/系统问题还是我必须更改ld选项?怎么做 谢谢你,很抱歉问了你这个“愚蠢”的问题。。。(还有我糟糕的“英语”) 编辑:“已解决”(见下文),只需添加从gcc-v main.c[COLLECT\u g

我知道这是一个非常基本的问题,但当我发现类似的问题时,我没有找到解决方案

我对这个简单的程序也有同样的问题:

#include <stdio.h>

void main()
{
    printf("Hi\n");
    fflush(stdout);
}
有人知道怎么回事吗?是环境/系统问题还是我必须更改ld选项?怎么做

谢谢你,很抱歉问了你这个“愚蠢”的问题。。。(还有我糟糕的“英语”)

编辑:“已解决”(见下文),只需添加从gcc-v main.c[COLLECT\u gcc\u options]获得的新ld选项,我正试图在最小值减少这些选项:

ld -o main main.o --hash-style=gnu --as-needed -dynamic-linker /lib/ld-linux.so.2 -z relro /usr/lib/gcc/i686-linux-gnu/5/../../../i386-linux-gnu/crt1.o /usr/lib/gcc/i686-linux-gnu/5/../../../i386-linux-gnu/crti.o /usr/lib/gcc/i686-linux-gnu/5/crtbegin.o -L/usr/lib/gcc/i686-linux-gnu/5 -L/usr/lib/gcc/i686-linux-gnu/5/../../../i386-linux-gnu -L/usr/lib/gcc/i686-linux-gnu/5/../../../../lib -L/lib/i386-linux-gnu -L/lib/../lib -L/usr/lib/i386-linux-gnu -L/usr/lib/../lib -lgcc --as-needed -lgcc_s --no-as-needed -lc -lgcc --as-needed -lgcc_s --no-as-needed /usr/lib/gcc/i686-linux-gnu/5/crtend.o /usr/lib/gcc/i686-linux-gnu/5/../../../i386-linux-gnu/crtn.o
EDIT2:为了启动程序,我认为min是

ld -o main main.o --as-needed -dynamic-linker /lib/ld-linux.so.2 -lc

它返回一个分段错误(我认为是因为缺少到crt*的链接)

您不能只通过noting链接一个对象文件来获得一个可执行文件。您需要链接定义对象文件所需符号的库。由于任何C程序都需要一些启动代码来初始化
main
的argc和argv,因此您可能至少需要链接一个通常称为
crt0.o
的文件,可能还需要链接到C标准库


这很复杂。如果您使用
gcc-v
运行详细编译,您可以看到实际的link命令。

您不能仅使用noting链接对象文件以获得可执行文件。您需要链接定义对象文件所需符号的库。由于任何C程序都需要一些启动代码来初始化
main
的argc和argv,因此您可能至少需要链接一个通常称为
crt0.o
的文件,可能还需要链接到C标准库


这很复杂。如果您使用
gcc-v
运行详细编译,您可以看到实际的link命令。

如果让
gcc
调用
ld
,是否会出现相同的错误,也就是说,如果您使用以下链接会发生什么:
gcc-o main.o
?不,如果我让gcc调用ld,我没有问题,很抱歉,我必须突出显示它。此答案有助于:?尝试使用verbose(-v)标志在.o文件上调用
gcc
。它将打印用于调用
ld
的命令。检查它传递给
ld
@KlasLindbäck的其他标志实际上您链接的答案有帮助,使用ld中GCC-v打印的COLLECT\u GCCä选项,程序工作,谢谢如果让
GCC
调用
ld
,也就是说,如果使用以下链接会发生什么:
GCC-o main.o
?否,如前所述,如果我让gcc调用ld,我没有问题,很抱歉,我必须更好地突出显示它。此回答有帮助吗:?尝试使用verbose(-v)标志在.o文件上调用
gcc
。它将打印用于调用
ld
的命令。检查它传递给
ld
@klaslindb228 ck的其他标志实际上您链接的答案有帮助,使用ld中GCC-v打印的COLLECT\u GCC\u选项,程序工作,谢谢是的,谢谢,我在上面建议的GCC-v查找后解决了是的,谢谢,我在上面建议的GCC-v查找后解决了
ld -o main main.o --as-needed -dynamic-linker /lib/ld-linux.so.2 -lc