【发布时间】:2014-07-30 16:22:16
【问题描述】:
如您所见,链接时有多个 testfn 符号定义,但链接器采用第一次出现(按链接顺序)并忽略其他库中的其他出现。 这可能是链接器的工作方式。
但是有没有办法强制链接器在看到不同链接库中的多个符号时标记错误?或任何其他选项来捕获此类重复定义?
test1.h 的内容:
#ifndef TEST1
#define TEST1
void testfn();
#endif
test1.cpp 的内容
#include "test1.h"
#include <iostream>
using namespace std;
void testfn()
{
cout << "file1" << endl;
}
test.h 的内容:
#ifndef TEST
#define TEST
void testfn();
#endif
test.cpp 的内容:
#include "test.h"
#include <iostream>
using namespace std;
void testfn()
{
cout << "file" << endl;
}
main.cpp 的内容:
#include "test.h"
#include "test1.h"
int main()
{
testfn();
return 0;
}
创建了一个共享库。
g++ -fPIC -shared libtest1.so test1.cpp
g++ -fPIC -shared libtest.so test.cpp
使用库顺序#1 创建可执行文件
g++ -o main main.cpp -ltest -ltest1
使用库顺序#2 创建可执行文件
g++ -o main1 main.cpp -ltest1 -ltest
主输出
./main
file
main1 的输出
./main1
file1
【问题讨论】:
-
我记得,违反 ODR 不需要诊断。
标签: c++ header linker g++ redefinition