一个极其简单的问题演示:
#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) 上直接编译总是有效的。
将
link = ld
更改为 link = gcc
,在这种情况下,您也可以丢弃 libs = -lc
。
裸链接器(ld
)仅链接您指定的内容,不包括程序
启动代码。当通过 gcc
调用时(像往常一样),gcc
会默默地追加
链接器命令行的样板,包括所需的语言运行时和
启动代码。