相关疑难解决方法(0)

当对象文件和静态库中相同的符号共存时,链接器不会发出多个定义错误

给定一个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)

c linker

4
推荐指数
1
解决办法
1073
查看次数

标签 统计

c ×1

linker ×1