我在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:如果您提及进行此类学习的任何资源,那将非常有帮助。预先感谢。
回答您的问题:不,您不需要为库定义主入口点。
这里的键是gcc的-c
选项,它将跳过链接阶段。
从gcc手册页:
-c:编译或汇编源文件,但不链接。链接阶段根本没有完成。最终输出为每个源文件的目标文件。
从错误输出判断,您可能忘记添加此选项来添加此输出,因为您收到链接器错误。
PD:我发现您关注的教程对此主题进行了很好的介绍性解释。
[要编译共享库时,不需要入口点。仅可执行文件才需要一个入口点,以便操作系统在加载二进制文件时知道要执行什么代码。
为了编译库,您需要在position independent code中进行编译。
gcc -c -fpic lib_mylib.c -o lib_mylib.o
这应该不会让您出现任何链接错误。然后从该目标文件创建一个实际的共享库,您需要运行:
gcc -shared -o lib_mylib.so lib_mylib.o
请告诉我这是否不能带来预期的结果。