gpt4 book ai didi

c++ - 为什么在这种情况下 g++ 不遵守一个定义规则 (ODR)? .

转载 作者:行者123 更新时间:2023-11-30 04:02:31 26 4
gpt4 key购买 nike

如您所见,链接时有多个 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。这就是共享库的工作方式。

如果你想看到编译器提示这个,将它们全部链接在一起,而不是库步骤。

g++ -o main1 main.cpp test1.cpp test.cpp

所以你的问题变成了,“我如何判断我是否有两个库都包含同名的标识符?”请记住,这通常不是问题,有时是故意这样做的。我建议运行库工具(我不熟悉 g++ 工具集)来获取库列表,然后运行它们的 DIFF。

关于c++ - 为什么在这种情况下 g++ 不遵守一个定义规则 (ODR)? .,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25041992/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com