一个极其简单的问题演示:

#include <stdio.h>


void myFunc()
{
    puts("Greetings, Code 'Mon ...");
}

int main(int argc, char *argv[])
{
    puts("zMain 01.\n");
    myFunc();
    puts("zMain 02.\n");
}

Target main_test2.run发出"文件未找到",正如通过gcc在Ubuntu 20.04.6 RTS上发出的那样:

...
ld: warning: cannot find entry symbol _start; defaulting to 0000000000401030
...
/main_test/yikes01$ ./main_test2.run
bash: ./main_test2.run: No such file or directory

运行相同,但忽略main()作为|开始|MinGW / Windows 10上的要点:

c:\tmp\main_test\yikes01>main_test2.run
Greetings, Code 'Mon ...

c:\tmp\main_test\yikes01>main_test.run
zMain 01.

Greetings, Code 'Mon ...
zMain 02.

Project + makfile为github,但这里是后者:

cc=gcc -v
opts = 
link = ld

ifdef OS
    libs = -LC:/Windows/System32 -lkernel32 -lmingw32 -lcrtdll 
else
    libs = -lc
endif

all: main_test2.run main_test.run Makefile

# First function becomes void main(void) ...
main_test2.run: main_test.c
    $(cc) $(opts) -c main_test.c
    $(link)  main_test.o -o main_test2.run $(libs)
    rm -f main_test.o
    
main_test.run: main_test.c
    gcc main_test.c -o main_test.run

clean:
    rm -f *.o
    rm -f *.run

你知道这里有什么备用吗?如何链接gmon_start

注意:交换参数确实会产生一些略有不同的结果-在CLI(main_test.run)上的直接兼容总是有效的.

推荐答案

link = ld更改为link = gcc,在这种情况下,您也可以丢弃libs = -lc. 空链接器(ld)仅链接您指定的内容,不包括程序 启动代码.当通过gcc调用时(像往常一样),gcc会被添加 链接器命令行的样板,包括所需的语言运行时和 启动代码.

更改后,您将能够看到添加到的额外库和对象文件 如果用gcc -v判断输出,则为联动.

Linux相关问答推荐

使用sed或awk映射自定义和任意函数

在Zenity进度窗口上单击取消后如何停止bash脚本

OpenCV编译错误&未定义的引用&Quot;

AWK+向AWK导出值未传递

如何在 shell 脚本中自定义 SFTP 详细输出

使用 YASM 程序集时如何更改 64 位 Linux 中的终端 colored颜色 ?

sed 命令在 gitlab runner 上无法正确执行

在android上使用lldb-server进行lldb调试?

在不调试的情况下查找哪个汇编指令导致了非法指令错误

bash 中的sed命令

在 64 位 Linux 操作系统上编译 32 位程序导致致命错误

Vagrant chicken-and-egg:与 uid = apache 用户共享文件夹

使用特定目录作为根目录压缩目录的命令

使用 linux 命令行 (bash) 从网络摄像头拍照

如何在 Bash 中对齐空格分隔表的列?

如何知道是否有足够的内存可以在 Linux 机器上部署新应用程序?

C ++中套接字上的协议缓冲区

try 使用 sudo 将文件附加到根拥有的文件时权限被拒绝

什么是 linux 脚本中的 start-stop-daemon?

linux脚本杀死java进程