问题:在gcc静态链接的过程中,如果多个模块有同名变量,链接顺序如何?是否会有冲突?
1、我们先测试下面这段代码,发现同名变量或者方法,不是一定会发生冲突的:
//common.h
#ifndef COMMON_H
#define COMMON_H
#include<iostream>
using namespace std;
#ifndef LABEL
#define LABEL "common"
#endif
class Common{
public:
static void f() {
cout << "Common::f "
<< LABEL << endl;
}
};
void __attribute__((weak)) disp() {}
#endif // COMMON_H
//a.h
#ifndef A_H
#define A_H
class A
{
public:
void f();
};
#endif // A_H
//a.cc
#define LABEL "a"
#include "a.h"
#include "common.h"
#include <iostream>
#include <stdio.h>
using namespace std;
void A::f() {
cout << "[A::f]" << endl;
typedef void (*P)();
P p = Common::f;
printf("%p\n", p);
//打印函数指针值
p();
}
//b.h
#ifndef B_H
#define B_H
class B
{
public:
void f();
};
#endif // B_H
//b.cc
#define LABEL "b"
#include "b.h"
#include "common.h"
#include <iostream>
#include <stdio.h>
using namespace std;
void B::f() {
cout << "[B::f]" << endl;
typedef void (*P)();
P p = Common::f;
printf("%p\n", p);
//打印函数指针值
p();
}
//main.cc
#define LABEL "main"
#include "a.h"
#include "b.h"
#include "common.h"
#include <iostream>
#include <stdio.h>
using namespace std;
int main()
{
A a;
a.f();
B b;
b.f();
cout << "[main]" << endl;