给定一个void some_func()
在静态库中具有签名的编译函数,以及另一个void some_func()
在目标文件中具有相同签名的函数,人们期望当它们将它们链接在一起时,应该发生"多重定义"错误.
但这种情况并非如此.据我所见,链接器(使用GCC和MSVC工具链测试)选择驻留在目标文件中的实现,而不会发出任何错误或警告.
鉴于以下POC:
somelib.h
#ifndef _SOMELIB_H_
#define _SOMELIB_H_
void some_func();
#endif /* _SOMELIB_H_ */
Run Code Online (Sandbox Code Playgroud)
somelib.c
#include "somelib.h"
#include <stdio.h>
void some_func()
{
printf("some_func in library\n");
}
Run Code Online (Sandbox Code Playgroud)
troublingheader.h
#ifndef _TROUBLING_HEADER_H_
#define _TROUBLING_HEADER_H_
void some_func();
#endif /* _TROUBLING_HEADER_H_ */
Run Code Online (Sandbox Code Playgroud)
troublingsource.c
#include "troublingheader.h"
#include <stdio.h>
void some_func()
{
printf("Troubling func\n");
}
Run Code Online (Sandbox Code Playgroud)
main.c中
#include <stdio.h>
#include "somelib.h"
int main()
{
some_func();
}
Run Code Online (Sandbox Code Playgroud)
还有一个简单的Makefile来帮助构建(首先创建tmp文件夹):
tmp/wat.exe: tmp/libsomelib.a tmp/main.c.o tmp/troublingsource.c.o
gcc -static -static-libgcc -Ltmp -otmp/wat.exe tmp/main.c.o tmp/troublingsource.c.o -lsomelib
tmp/main.c.o:
gcc -Wall …
Run Code Online (Sandbox Code Playgroud)