同一项目在Oment++ 6.0.2中Windows模式下链接器错误而Linux环境下没有错误的原因

问题描述 投票:0回答:1

我使用 Omnet++ 6.0.2 中提供的 mingwenv 工具在 Windows 11 上构建了我的项目,但出现了链接器错误。我在 Ubuntu 版本 22 平台上使用 Omnet++ 6.0.2 构建了相同的项目,但构建了相同的项目,没有任何错误。为什么 Windows 模式下会出现此错误?如何解决此问题? 部分链接器错误如下:

>>>               out/clang-debug//source/routing/myAodvRouteData.o:(myaodv::myAodvRouteData::~myAodvRouteData())

ld.lld: error: undefined symbol: __declspec(dllimport) vtable for myaodv::myAodvControlPacketsSerializer
>>> referenced by source/routing/myAodvControlPacketsSerializer.h:26
>>>               out/clang-debug//source/routing/myAodvControlPacketsSerializer.o:(myaodv::myAodvControlPacketsSerializer::myAodvControlPacketsSerializer())
clang++: error: linker command failed with exit code 1 (use -v to see invocation)
make: *** [Makefile:104: out/clang-debug//myAODV_dbg.exe] Error 1
"make MODE=debug all" terminated with exit code 2. Build might be incomplete.
omnet++ inet
1个回答
0
投票

在 Windows 上链接动态库 (DLL) 比在 Linux 上复杂得多。

在 Linux 上,您只需首先构建共享库,然后在其他项目中使用头文件并链接到该库,Linux 动态链接器将直接将两个二进制文件链接在一起,无需任何用户帮助。

Windows 的工作方式有所不同。为了能够动态链接两个二进制文件,必须在调用方和被调用方站点使用特殊代码,这些代码必须在编译阶段生成。这意味着必须从相同的类/方法声明生成不同的代码,具体取决于它是在 .DLL 文件还是被调用程序(.EXE 文件)内使用。在一种情况下,您必须添加

__declspec(dllexport)
,在另一种情况下则必须添加
__declspec(dllimport)
。这只能通过定义各种宏来完成,这些宏根据使用情况扩展到其中任何一个。

检查

INET_API
宏在 INET 中的工作方式(在 INETDefs.h 中),并且您必须为自己的项目实现类似的方法(使用您自己的宏名称),然后从编译器命令行传递所需的定义,具体取决于您是否正在构建 DLL (XXX_EXPORT) 或使用 (XXX_IMPORT) 它。在 INET 中看起来像这样:

#if defined(INET_EXPORT)
#define INET_API          OPP_DLLEXPORT
#elif defined(INET_IMPORT)
#define INET_API          OPP_DLLIMPORT
#else // if defined(INET_EXPORT)
#define INET_API
#endif // if defined(INET_EXPORT)

并且您通过了

-DINET_EXPORT
-DINET_IMPORT

我知道...它看起来令人困惑和复杂,因为它是...

© www.soinside.com 2019 - 2024. All rights reserved.