为库定义一个main()(入口点)是必要的吗

  • 本文关键字:入口 一个 定义 main c++ g++
  • 更新时间 :
  • 英文 :


我一直在学习如何创建静态库的教程,作者在lib_mylib.c中定义了一个函数(用于库(为:

#include <stdio.h> //Although I use <iostream>
void fun(void) 
{ 
printf("fun() called from a static library"); 
}

他继续简单地将其编译为:

gcc -c lib_mylib.c -o lib_mylib.o 

请注意,没有定义作为程序默认入口点的main(),但他对此只字未提,对我来说,这似乎是合乎逻辑的,因为库并不是我们运行的东西,而是我们为程序运行所包含的东西,因此我们的源代码应该具有main()函数。

但是,minGW g++ compiler says this:

c:/mingw/bin/../lib/gcc/mingw32/8.2.0/../../../../mingw32/bin/ld.exe: c:/mingw/bin/../lib/gcc/mingw32/8.2.0/../../../libmingw32.a(main.o):(.text.startup+0xc0): undefined reference to `WinMain@16'
collect2.exe: error: ld returned 1 exit status

根据这个问题,我没有定义main,一旦我定义main((函数,错误似乎就会消失。有谁能向我解释一下引擎盖下面发生了什么,并消除这种困惑吗。

附言:如果你提到任何学习资源,那真的会很有帮助。提前谢谢。

回答您的问题:不,您不需要为库定义主入口点

这里的关键是gcc中的-c选项,它跳过了链接阶段。

来自gcc手册

-c:编译或汇编源文件,但不要链接。链接这个阶段根本没有结束。最终输出的形式是每个源文件的对象文件。

您可以在此处查阅更多gcc选项。

根据您的错误输出判断,您可能忘记添加此选项,因为您遇到了链接器错误。

附言:我发现你下面的教程对这个主题有很好的介绍性解释。

编辑

您的问题与编译链接之间的差异有关。

C程序是用人类可读的源代码编写的,而不是可由计算机直接执行。需要三个步骤将源代码转换为可执行代码。这三个步骤是:预处理、编译和链接

预处理-处理指令(以#字符(,它可以在编译源代码之前修改源代码。

编译-修改后的源代码被编译为二进制目标代码。此代码尚未可执行

链接-目标代码与所需的支持代码相结合,形成可执行程序。此步骤通常包括添加所需的任何库

在这里,您可以找到一个关于基本C概念的有趣教程。

当您想要编译共享库时,不需要入口点。只有可执行文件才需要入口点,这样操作系统在加载二进制文件时就知道要执行什么代码。

为了编译库,您需要编译独立于位置的代码。

gcc -c -fpic lib_mylib.c -o lib_mylib.o

这应该不会导致链接错误。然后从这个对象文件创建一个实际的共享库,您需要运行:

gcc -shared -o lib_mylib.so lib_mylib.o

如果这不能带来预期的结果,请告诉我。

相关内容

最新更新