为必要的库定义main()(入口点)?

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

我在following this tutorial上是关于如何创建静态库的,而作者在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

and according to this question我没有定义main,并且一旦定义main()函数,错误does似乎就消失了。谁能向我解释幕后的情况并消除这种混乱。

PS:如果您提及进行此类学习的任何资源,那将非常有帮助。预先感谢。

c++ g++
2个回答
1
投票

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

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

从gcc手册页:

-c:编译或汇编源文件,但不链接。链接阶段根本没有完成。最终输出为每个源文件的目标文件。

从错误输出判断,您可能忘记添加此选项来添加此输出,因为您收到链接器错误。

PD:我发现您关注的教程对此主题进行了很好的介绍性解释。


0
投票

[要编译共享库时,不需要入口点。仅可执行文件才需要一个入口点,以便操作系统在加载二进制文件时知道要执行什么代码。

为了编译库,您需要在position independent code中进行编译。

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

这应该不会让您出现任何链接错误。然后从该目标文件创建一个实际的共享库,您需要运行:

gcc -shared -o lib_mylib.so lib_mylib.o

请告诉我这是否不能带来预期的结果。

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