- 主题:关于headers only的库编译的小白问题
某些三方库只有header文件,比如 spdlog 等等。
如果项目中有 a.cpp b.cpp都include这些header文件,编译之后a.obj b.obj都有函数的实现代码,那么a和b link的时候,不会有冲突吗?
--
FROM 120.245.130.*
每个header
file
不都有
#pragma once吗
【 在 misslost 的大作中提到: 】
: 某些三方库只有header文件,比如 spdlog 等等。
: 如果项目中有 a.cpp b.cpp都include这些header文件,编译之后a.obj b.obj都有函数的实现代码,那么a和b link的时候,不会有冲突吗?
--
FROM 67.186.83.*
他不是这个意思吧,是模版实例化same type in multiple files,导致exe膨胀的问题吧
编译时每个obj都声成同样的代码,有重复;
链接时,linker会消除这些重复,每种类型的实例只保留一份。
【 在 mvtec 的大作中提到: 】
: 每个header
: file
: 不都有
: ...................
--
FROM 124.114.151.*
有些时候还是需要手动打inline,不然编译器要报错,模板不存在这个问题
【 在 DoorWay 的大作中提到: 】
: 他不是这个意思吧,是模版实例化same type in multiple files,导致exe膨胀的问题吧
: 编译时每个obj都声成同样的代码,有重复;
: 链接时,linker会消除这些重复,每种类型的实例只保留一份。
: ...................
--
修改:haha103 FROM 182.150.115.*
FROM 182.150.115.*
可以做个更加有趣的实验。
两个头文件A1.h,A2.h
里面都实现相同的类A,并有一个内联函数,但实现方式不一样。
两个cpp文件。B.c包含A1.h,调用A,D.cpp包含A2.h,调用A。和主文件一起编译连接。
猜猜会有什么结果?能否成功?调用哪个版本的A?
【 在 haha103 的大作中提到: 】
: 有些时候还是需要手动打inline,不然编译器要报错,模板不存在这个问题
: 【 在 DoorWay 的大作中提到: 】
: : 他不是这个意思吧,是模版实例化same type in multiple files,导致exe膨胀的问题吧
: ...................
--来自微微水木3.5.12
--
FROM 39.144.44.*
这个违反one definition rule了吧。
【 在 KillnCov 的大作中提到: 】
: 可以做个更加有趣的实验。
: 两个头文件A1.h,A2.h
: 里面都实现相同的类A,并有一个内联函数,但实现方式不一样。
: ...................
--
FROM 183.192.37.*
是的,cpp的世界已经很难了,就别再卖关子了。
【 在 gunix 的大作中提到: 】
: 这个违反one definition rule了吧。
--
FROM 124.114.151.*
header only 本质上就是我说的这个试验的简化版本。
【 在 gunix 的大作中提到: 】
: 这个违反one definition rule了吧。
: 【 在 KillnCov 的大作中提到: 】
: : 可以做个更加有趣的实验。
: ...................
--来自微微水木3.5.12
--
FROM 39.144.44.*
定义在头文件里的class之内的函数默认是inline的。
https://stackoverflow.com/questions/66528686/basic-odr-violation-member-functions-in-h-files
MSVC有个专用属性__declspec(selectany)来解决定义在头文件里的class之外的变量和函数的冲突
gcc/clang也有__attribute__((selectany))
也就是如果某人非要在.h里写一个独立函数体或者写个不带extern的全局变量(静态成员变量也一样),那可以加上selectany属性(函数可以加上inline,变量没法加inline,只能加selectany)
a.h:
class CMyClass{
private:
static int m_static;
}
__declspec(selectany) int CMyClass::m_static = 0;
--
修改:z16166 FROM 114.241.227.*
FROM 114.241.227.*
没太明白,header only会出现你这个试验里定义不一致的情况吗?
【 在 KillnCov 的大作中提到: 】
: header only 本质上就是我说的这个试验的简化版本。
--
FROM 27.115.119.*