c++ - 仅当在 Visual Studio 2019 中以 C++ 模式编译静态库时才链接代码
问题描述
我创建了一个用于 C/C++ 开发的链表管理器的 WIN32 静态库。
我在 Visual Studio 2019 上编译了这个库,强制它编译为 C 代码(/TC
VS2019 首选项中的选项)。但是,我确实使用了
#ifdef __cplusplus
extern "C" {
#endif
在标题中,以防我的静态库被 C++ 程序使用。这是标题的链接。
但是,当我在 C++ 项目中使用这个静态库时,我得到了链接器错误
1>quickDAQ.obj : error LNK2019: unresolved external symbol "unsigned long __cdecl cListLength(struct _cLinkedList *)" (?cListLength@@YAKPAU_cLinkedList@@@Z) referenced in function "void __cdecl quickDAQstart(void)" (?quickDAQstart@@YAXXZ)
1>quickDAQ.obj : error LNK2019: unresolved external symbol "int __cdecl cListEmpty(struct _cLinkedList *)" (?cListEmpty@@YAHPAU_cLinkedList@@@Z) referenced in function "void __cdecl setSampleClockTiming(enum _sampling_modes,double,char *,enum _trigger_modes,unsigned __int64,bool)" (?setSampleClockTiming@@YAXW4_sampling_modes@@NPADW4_trigger_modes@@_K_N@Z)
1>quickDAQ.obj : error LNK2019: unresolved external symbol "struct _cListElem * __cdecl cListFirstElem(struct _cLinkedList *)" (?cListFirstElem@@YAPAU_cListElem@@PAU_cLinkedList@@@Z) referenced in function "void __cdecl enumerateNIDevices(void)" (?enumerateNIDevices@@YAXXZ)
1>quickDAQ.obj : error LNK2019: unresolved external symbol "struct _cListElem * __cdecl cListNextElem(struct _cLinkedList *,struct _cListElem *)" (?cListNextElem@@YAPAU_cListElem@@PAU_cLinkedList@@PAU1@@Z) referenced in function "void __cdecl enumerateNIDevices(void)" (?enumerateNIDevices@@YAXXZ)
1>quickDAQ.obj : error LNK2019: unresolved external symbol "void * __cdecl cListFirstData(struct _cLinkedList *)" (?cListFirstData@@YAPAXPAU_cLinkedList@@@Z) referenced in function "void __cdecl syncSampling(void)" (?syncSampling@@YAXXZ)
1>quickDAQ.obj : error LNK2019: unresolved external symbol "int __cdecl cListInit(struct _cLinkedList *)" (?cListInit@@YAHPAU_cLinkedList@@@Z) referenced in function "void __cdecl enumerateNIDevices(void)" (?enumerateNIDevices@@YAXXZ)
1>quickDAQ.obj : error LNK2019: unresolved external symbol "int __cdecl cListAppend(struct _cLinkedList *,void *)" (?cListAppend@@YAHPAU_cLinkedList@@PAX@Z) referenced in function "void __cdecl enumerateNIDevices(void)" (?enumerateNIDevices@@YAXXZ)
1>quickDAQ.obj : error LNK2019: unresolved external symbol "int __cdecl cListPrepend(struct _cLinkedList *,void *)" (?cListPrepend@@YAHPAU_cLinkedList@@PAX@Z) referenced in function "void __cdecl pinMode(unsigned int,enum _IOmodes,unsigned int)" (?pinMode@@YAXIW4_IOmodes@@I@Z)
1>quickDAQ.obj : error LNK2019: unresolved external symbol "void __cdecl cListUnlinkElem(struct _cLinkedList *,struct _cListElem *)" (?cListUnlinkElem@@YAXPAU_cLinkedList@@PAU_cListElem@@@Z) referenced in function "void __cdecl enumerateNIDevices(void)" (?enumerateNIDevices@@YAXXZ)
1>C:\Users\tyros\codebase\testingLinkedList\Debug\testingLinkedList.exe : fatal error LNK1120: 9 unresolved externals
1>Done building project "testingLinkedList.vcxproj" -- FAILED.
显然,链接器无法链接到静态库。
但是,如果我使用设置为 C++ ( ) 的 compile as 标志来编译静态库/TP
,我正在使用该库的项目编译时不会出现上述错误。
为什么是这样?
解决方案
问题是PEBKAC。我忘记包含新的头文件(具有 C++ 的 extern "C" 定义)以及新版本的静态库。这导致了使用该库破坏符号的 C++ 项目。
故事的寓意 - 在更新 C++ 项目使用的库时,始终更改头文件和静态库。
推荐阅读
- laravel - Composer 自动加载器找不到类
- c++ - C++20 中是否允许使用east constexpr / constinit / consteval?
- excel - 从 excel 发布到 azure 时如何在 azure board 中添加所有项目,包括默认 6 项以外的项目
- c++ - 无法在 VS2017 上将 libclang 与 cmake 链接
- javascript - axios.patch 和数据加载问题
- python - 如何使用 rstrip 从由循环生成的字符串中删除尾随空格
- reactjs - 当输入为空白时,应按 Backspace 删除最后一个芯片
- python-3.x - 打印枚举列表的第 n 个索引
- c++ - 如何在 C++ 中将整数从一种方法调用到另一种方法
- apache-spark - 如何在 Kafka 和 spark-sql 中管理流式应用程序中的审计?