GNC C:关于主要起点混乱的想法?

问题描述 投票:0回答:1

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

#include <stdio.h>


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

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

目标 main_test2.run 在 Ubuntu 20.04.6 LTS 上通过

gcc
发出“找不到文件”:

...
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() 作为 |starting| 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.

项目 + makefile 位于 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) 上直接编译总是有效的。

linux gcc windows-10 mingw ld
1个回答
0
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.