gpt4 book ai didi

c - 多个定义,包括开源库(具有看似正确的链接器设置?)

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:19:34 28 4
gpt4 key购买 nike

我正在为我的研究开发一个程序,它使用一个开源库。它旨在在 Raspberry Pi(Raspbian 内核)上运行。由于我打算也能够将它加载到 PLC 上,所以我主要使用纯 C。库本身带有合适的头文件和 .c 文件。

当我在 Raspberry 上使用预安装的 GCC 编译器时,我的程序编译没有任何错误并且工作正常。现在我的问题来了:

我尝试使用安装了 MinGW 的 code::blocks IDE 让这个项目在 Windows 上运行。我重新访问了库并下载了适用于 Windows 的 zip(显然是相同的 header 和 .c 文件,但还包括 .lib 和 .dll)。

我在项目中设置搜索目录和链接器设置,并像往常一样使用 #include "header.h" 作为相对路径包含 header 。它不编译并给出了很多 multible definitionfirst defined here 这通常表示错误的链接和包含。

当我试图识别其中的一些定义时,我注意到导致错误的函数在 library.c 文件中定义了一次。在此 .c 文件的开头,它还包含一次 header 。

简短摘要:

这适用于 raspbian GCC:

$ gcc -sdt=c99 main.c library.c -o executable

但在使用 Windows IDE + MinGW 时会出错

我是不是漏掉了什么严重的东西?动态链接库只能由之后的可执行文件使用。我想也许 libraby.c 会被 library.lib 取代,但如果我删除其中一个,项目将不知道这些函数。我还搜索了错误的内含物。我真的在这里知识尽头,并且还搜索了对我有帮助的帖子,但这些帖子主要是“链接器路径在哪里”或“包含 .c 文件”。这似乎是一个我忽略的简单问题。

任何帮助都会得到帮助。如果需要,我会提供更多详细信息。谢谢!

编辑(2):

obj\Debug\open62541.o:open62541.c:(.text+0x3152a): undefined reference to `__imp_shutdown'
obj\Debug\open62541.o:open62541.c:(.text+0x3153f): undefined reference to `__imp_closesocket'
obj\Debug\open62541.o:open62541.c:(.text+0x315a7): undefined reference to `__imp_send'
obj\Debug\open62541.o:open62541.c:(.text+0x315b9): undefined reference to `__imp_WSAGetLastError'
.....

编辑(3)

回答1!编译好了,谢谢大家。

最佳答案

看起来你的库是 open62541。

有两种方法可以将库包含在源代码中:

  • 构建共享/静态库并将其链接到您的代码
  • 启用 Amalgamation,它会生成一个 .c 和 .h 文件,您可以直接使用您的代码进行编译

您在 mingw 上组合了这两种方法,这将整个库添加了两次。可能您只想链接没有 .lib 的 .c 文件,因此您的编译命令应该如下所示:

gcc -sdt=c99 main.c open62541.c -o test

此外,由于 open62541 在 windows 上需要 ws2_32 库,因此应调用编译器:

gcc -std=c99 main.c open62541.c -o test -lws2_32

关于c - 多个定义,包括开源库(具有看似正确的链接器设置?),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45478231/

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