最新要闻
- 天天信息:福建省第二届短视频大赛正式启动
- 5月31日发布会!法拉第未来5月底启动FF 91第一阶段交付
- 男子弄丢价值百万唐伯虎真迹:好心市民捡到后交还 快资讯
- 618来了!AMD Zen4价格跳水:锐龙9 7950X上市半年直接6折|天天快资讯
- 世界即时看!“熊孩子”惹祸:女童剪掉顾客一撮头发 家长赔1万多
- 到底谁会买?《魔戒:咕噜》口碑扑街:媒体均分低至38分
- 59岁水均益罕现身和富婆合影,吃大餐喝名贵酒,模样大变发福油腻
- 比奥迪Q3更值得买!全新凯迪拉克GT4官图发布:颜值真能打 时讯
- 要涨价了!上海迪士尼6月23日起门票调价 世界动态
- OpenAI CEO:在重压下会考虑退出欧洲市场
- 双飞燕推出VM20蓝牙鼠标:用嘴“打字”见过没
- 新西兰航空空乘努力用中文报菜名 拍摄者:他不懂中文但努力服务 环球快报
- 大阪宝可梦中心因发放特别宝可梦卡造成人潮混乱 现场一片狼藉
- 微信向部分Windows用户推送版本更新 现已增加锁定功能
- 苹果于国外上架可定位控温旅行杯 售价高达1413元引发网友吐槽
- 前《战地》创意总监成立新工作室 称正在研发在线射击游戏
手机
iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?
警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案
- iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?
- 警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案
- 男子被关545天申国赔:获赔18万多 驳回精神抚慰金
- 3天内26名本土感染者,辽宁确诊人数已超安徽
- 广西柳州一男子因纠纷杀害三人后自首
- 洱海坠机4名机组人员被批准为烈士 数千干部群众悼念
家电
全球热推荐:编译静态库遇到的 LNK2019 报错
前文提到了 CMake 学习
文末基本涵盖了我遇到的编译问题,但是在得到一个编译好的 .lib 文件后,还需要放到项目中引用成功后才算真正的完成静态库的编译
(相关资料图)
嗯,我之所以说这些是因为我在项目中链接静态库时出现了 LNK2019 经典错误
错误如下:
Libraryd.lib(at_exit.obj) : error LNK2019: unresolved external symbol "void __cdecl logging::MakeCheckOpValueString(class std::basic_ostream > *,class base::AtExitManager *)Libraryd.lib(rand_util.obj) : error LNK2019: unresolved external symbol "void __cdecl logging::MakeCheckOpValueString (class std::basic_ostream > *,double)" Libraryd.lib(rand_util.obj) : error LNK2019: unresolved external symbol "void __cdecl logging::MakeCheckOpValueString (class std::basic_ostream > *,unsigned __int64)"Libraryd.lib(file_path.obj) : error LNK2019: unresolved external symbol "void __cdecl logging::MakeCheckOpValueString (class std::basic_ostream > *,wchar_t const *)"
我们先看 .h 和 .cc 文件中对MakeCheckOpValueString 的声明和定义吧
.h 文件
// Provide an overload for functions and function pointers. Function pointers// don"t implicitly convert to void* but do implicitly convert to bool, so// without this function pointers are always printed as 1 or 0. (MSVC isn"t// standards-conforming here and converts function pointers to regular// pointers, so this is a no-op for MSVC.)templateinline typename std::enable_if< std::is_function ::type>::value, void>::typeMakeCheckOpValueString(std::ostream* os, const T& v) { (*os) << reinterpret_cast (v);}// We need overloads for enums that don"t support operator<<.// (i.e. scoped enums where no operator<< overload was declared).template inline typename std::enable_if< std::is_enum ::value, void>::typeMakeCheckOpValueString(std::ostream* os, const T& v) { (*os) << static_cast ::type>(v);}// We need an explicit overload for std::nullptr_t.void MakeCheckOpValueString(std::ostream* os, std::nullptr_t p);template void MakeCheckOpValueString(std::ostream* os, T p);
.cc 文件
void MakeCheckOpValueString(std::ostream* os, std::nullptr_t p) { (*os) << "nullptr";}templatevoid MakeCheckOpValueString(std::ostream* os, T p) { (*os) << p;}
调用的地方:
// Build the error message string. This is separate from the "Impl"// function template because it is not performance critical and so can// be out of line, while the "Impl" code should be inline. Caller// takes ownership of the returned string.templatestd::string* MakeCheckOpString(const t1& v1, const t2& v2, const char* names) { std::ostringstream ss; ss << names << " ("; MakeCheckOpValueString(&ss, v1); ss << " vs. "; MakeCheckOpValueString(&ss, v2); ss << ")"; std::string* msg = new std::string(ss.str()); return msg;}
可以看出MakeCheckOpValueString 的声明和定义都是完整的
MakeCheckOpValueString 有四个重载,有两个 inline 声明的,直接在头文件中定义了,还有两个普通的 void 型,声明和定义是分开的
函数的声明和定义是没有问题的,有问题的话,在编译静态库时就应该出错了
后面研究后,怀疑是没有给外部工程暴露接口,也就是缺少 BASE_EXPROT 宏
这个宏的写法如下:
#ifdef BASE_EXPORT#undef BASE_EXPORT#endif#ifdef _WIN32// 定义 BASE_EXPORT 宏为适当的导出关键字,以便在 Windows 平台上导出函数#define BASE_EXPORT __declspec(dllexport)#else// 定义 BASE_EXPORT 宏为适当的导出关键字,以便在其他平台上导出函数#define BASE_EXPORT __attribute__((visibility("default")))#endif
顺便看看 dllexport 和 dllimport 的区别,看看 GPT 的回答
dllexport
和 dllimport
是用于在 Windows 平台上定义和使用动态链接库(DLL)中的函数和数据的关键字。
dllexport
用于在 DLL 中定义函数或数据,并指示编译器将这些符号导出到 DLL 中,以便其他模块(如应用程序)可以使用它们。当使用dllexport
修饰符时,编译器会生成导出符号表,并在链接时使其可见。dllimport
用于在应用程序中声明从 DLL 中导入的函数或数据。它告诉编译器该符号将在运行时从 DLL 中导入,而不是在当前模块中定义。使用dllimport
修饰符可以让应用程序在编译时知道要导入的符号的位置和类型。
关键区别在于:
dllexport
用于在 DLL 中定义符号,即导出符号。dllimport
用于在应用程序中声明从 DLL 中导入的符号。
这两个关键字的使用可以帮助实现动态链接库的功能,并支持在不同的模块之间共享函数和数据。在 Windows 平台上,它们是确保 DLL 的正确导出和导入的重要机制。
于是我们添加了 BASE_EXPORT 宏,并在MakeCheckOpValueString 声明前都添加了该宏,
// We need an explicit overload for std::nullptr_t.BASE_EXPORT void MakeCheckOpValueString(std::ostream* os, std::nullptr_t p);templateBASE_EXPORT void MakeCheckOpValueString(std::ostream* os, T p);
重新编译静态库,并在项目中链接库,还是出现同样的问题
没办法,BASE_EXPORT 似乎不起作用,项目链接函数时仍然找不到函数对应的符号文件,只能从 inline 下手了,直接在头文件中内联,并删除 .cc 文件中的函数的定义
改成这样:
// We need an explicit overload for std::nullptr_t.inline void MakeCheckOpValueString(std::ostream* os, std::nullptr_t p) { (*os) << "nullptr";}templateinline void MakeCheckOpValueString(std::ostream* os, T p) { (*os) << p;}
inline 关键词可以保证函数不会出现重复定义的错误,另外 inline 还有命名空间管理的特性
看看 inline 这两个细节的介绍
- 防止重定义(Multiple Definitions):在 C++ 中,如果同一个函数或变量在多个编译单元(源文件)中被定义,会导致重定义错误。为了解决这个问题,可以将函数或变量的定义放在头文件中,并使用
inline
关键字修饰,以便在多个编译单元中使用。这样,每个编译单元中对该函数或变量的定义都会被视为内联定义,避免了重定义错误。 - 命名空间的内联定义:在命名空间中定义的函数和变量,其声明和定义通常是分开的,即声明放在头文件中,定义放在源文件中。为了避免在每个源文件中都包含头文件,可以将命名空间中的函数和变量的定义放在头文件中,并使用
inline
关键字修饰。这样,每个源文件中包含头文件时,就相当于将命名空间中的定义直接内联到该源文件中,避免了多个源文件的重复定义。
最终,在重新编译静态库后,并在项目中链接它,没有出错,一切顺利
关键词:
-
通讯!Swift中常见的String用法,Array高阶使用,Set集合操作
String字符串常见用法生成字符串创建字符串letgreeting="Hello,world!"letname=String("John")连接字符串:
来源: 全球热推荐:编译静态库遇到的 LNK2019 报错
通讯!Swift中常见的String用法,Array高阶使用,Set集合操作
天天信息:福建省第二届短视频大赛正式启动
5月31日发布会!法拉第未来5月底启动FF 91第一阶段交付
男子弄丢价值百万唐伯虎真迹:好心市民捡到后交还 快资讯
618来了!AMD Zen4价格跳水:锐龙9 7950X上市半年直接6折|天天快资讯
世界即时看!“熊孩子”惹祸:女童剪掉顾客一撮头发 家长赔1万多
到底谁会买?《魔戒:咕噜》口碑扑街:媒体均分低至38分
【环球聚看点】Oracle迁移到MySQL时数据类型转换问题
SpringBoot结合easyexcel处理Excel文件-全球焦点
【打怪升级】【容器】关于Map
全球微动态丨海康威视SDK - 非非门禁和报警主机产品的用户密码设置
每日资讯:游戏逆向-D3D9绘制
59岁水均益罕现身和富婆合影,吃大餐喝名贵酒,模样大变发福油腻
债市日报:5月25日
比奥迪Q3更值得买!全新凯迪拉克GT4官图发布:颜值真能打 时讯
要涨价了!上海迪士尼6月23日起门票调价 世界动态
OpenAI CEO:在重压下会考虑退出欧洲市场
双飞燕推出VM20蓝牙鼠标:用嘴“打字”见过没
新西兰航空空乘努力用中文报菜名 拍摄者:他不懂中文但努力服务 环球快报
大阪宝可梦中心因发放特别宝可梦卡造成人潮混乱 现场一片狼藉
微信向部分Windows用户推送版本更新 现已增加锁定功能
苹果于国外上架可定位控温旅行杯 售价高达1413元引发网友吐槽
前《战地》创意总监成立新工作室 称正在研发在线射击游戏
热头条丨linux shell编程规范和变量
idea修改idea64.exe.vmoptions导致打不开问题
全球热文:突围低代码下半场,未来悬而未决
Python集合 (set) 的增删改查及 copy()方法_焦点简讯
苹果iOS 17将改进锁屏界面 会使iPhone变成家居智能屏幕
我国研究团队成功研制出高柔韧性单晶硅太阳电池 可以像纸片一样弯曲
药学基本题(药学基本知识)_天天快资讯
惠普打印机型号有哪些?惠普打印机墨盒怎么加墨水?
每日机构分析:5月25日
环球速看:双13.3寸OLED触屏!联想YOGA Book 9i国内发布:16999元
长城举报比亚迪排放不达标背后:专家称如果坐实 审核标准会被动摇|天天关注
全球仅此一份!布加迪在迪拜推出首批住宅:每家均独一无二 当前独家
30万魅友参与!魅族20新配色定名“独白”:行业唯一白面板机身|天天聚看点
中国电影华表奖颁奖典礼太接地气:一大波明星坐路边等待 环球微头条
2023年安徽合肥公积金缴存基数标准调整 3月1日起执行!
上海SIAL食品博览会成功举办!济州品牌初露头角!
它来了!真正的 python 多线程
KKRT-PSI
环球简讯:创新应用场景下的可视化大屏:重新定义信息展示
今日视点:如何证明Servlet是单例的?
构建高可用云原生应用,如何有效进行流量管理?
天天观天下!【新华500】新华500指数(989001)25日下跌0.22%
学堂有名堂|30分钟午睡时间,教室里睡不着睡不好怎么办?黄浦区这所小学展开了研究
比亚迪高管回怼长城举报:挡别人的路 不会让自己行得更远|天天消息
单价6.5亿 国产大飞机快能坐了 东航C919将于近期投入实际运营 当前要闻
全球播报:恩怨还没完!暴雪在中国起诉网易雷火公司
顶配16999元 联想YOGA Air 32 4K一体机发布:13代i9+RTX 4050 一线连所有
1.28kg超轻身材!联想发布YOGA Air 14s 2023轻盈本 天天微资讯
【PC迁移与管理】上海道宁为每个用户和每个 PC 传输和迁移场景提供解决方案——PCmover_每日热讯
天天热推荐:Pytest - setup 和 teardown
全球即时看!yolov5+deepsort+slowfast复现
全国护肤日(国际爱肤日):关注内外抗衰 远离皮肤疾病
最美小米手机!小米Civi 3亮相
减肥新方法!研究证实画饼真的能充饥|焦点滚动
新一代自拍之王!小米Civi 3前置双主摄:拍照Vlog全面兼顾 天天即时
称比亚迪污染物排放不达标 长城举报的是个啥:油箱成争议焦点
暖心!国羽苏杯夺冠黄东萍视频连线王懿律,黄鸭组合一同登台领奖
Maven的核心解压与配置 观热点
当前通讯!你怎么看?统计称上海人能挣钱更能花钱 全国北京人赚的钱最耐花
图灵奖得主:人类大脑是生物机器 一定会有超级AI超越它 今日热议
焦点消息!《雨血》精神续作!国产黑暗武侠大作《影之刃零》发布首支预告
天天关注:黄芪加枸杞大枣泡水喝的功效与作用 枸杞大枣泡水喝的功效与作用
SRE心里话:要求100%服务可用性就是老板的无知_环球信息
助数字人民币“飞入寻常百姓家”
国外玩家吐槽PS发布会拉跨:是不是最差的一届?-环球新资讯
消失70多年 一度被认为灭绝:广西发现珍稀植物巨型蜘蛛抱蛋
世界今日讯!AMD超算三连冠!唯一投入实用的百亿亿次
高性价高颜值轻薄本代表作!华硕无畏15 2023 4299元首发抢购中|世界快播
焦点速读:老人遛狗不牵绳还将猫踢飞 网友吵翻:这是在保护猫 你怎么看?
焦点资讯:5人5月用容器技术保卫蓝天
关于 Workstation Pro 的基础知识
文物 | 博物馆文物的数字化保护与管理
马上就要过期的食品打一折:能买吗?安全吗?
马斯克计划打造世界第三大AI公司 或整合特斯拉和推特
世界快报:强对流天气预警:今天起 多地将有8-10级雷暴大风或冰雹
奇丑无比的洞洞鞋凭啥风靡全球?但是 绝对别穿它上扶梯-天天热消息
蔚来ES6上市当天 李想立下flag:10月份理想L7月销破2万辆_前沿热点
天天动态:弃“元”投“AI”,传百度副总裁马杰加入创新工场,成立AIGC公司
实时:gPTP时钟同步(时间同步服务器)助力智能驾驶应用
当前消息!直播源码技术实现游戏组队功能
【环球财经】惠誉评级把美国长期外币发行人违约评级展望列为“负面”
美媒:无人机袭击克宫或为乌特别部门策划-全球热讯
springboot~统一处理日期请求参数java.utils.Date和java.time.LocalDate_天天播报
【一步步开发AI运动小程序】七、进行运动计时、计数
36.8万起!蔚来全新ES6开卖:激光雷达、零百4.5秒 会成爆款吗
入门即高配!比亚迪宋Pro DM-i冠军版今日上市:纯电续航再提升
超110万辆特斯拉到底何时召回?时间点来了 强制单踏板再见
百公里油耗仅仅7.4升!依维柯聚星正式上市:13.68万元起
全新宝马5系发布:内饰、科技大升级 看眼后视镜就能自动变道
世界今亮点!在旧时光里注入新生机——湖南郴州“唤醒老屋”行动观察
全球快报:第六章.数据结构与算法基础(重点)
今日快讯:海康威视SDK - 门禁admin用户密码设置
当前速递!走进Linux世界,学习Linux系统的必备指南
最美不过二次元【AI】
黑人女玩家谈《Forspoken》差评如潮:种族主义者的偏见|世界观热点
结婚6年没孩子 查出丈夫非男性:医生科普是性反转综合征 网友刷新认知