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

时间:2017-08-03 08:00:34

标签: c linux gcc linker open62541

我正在研究一个使用开源库的学习计划。它意味着在Raspberry Pi(Raspbian Kernel)上运行。因为我打算也可以将它加载到PLC上,而我主要使用的是纯粹的C.库本身带有合适的头文件和.c文件。

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

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

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

当我试图找出其中的一些定义时,我注意到导致错误的函数在library.c文件中定义了一次。在这个.c文件的开头,它还包括一次标题。

简短摘要:

这适用于raspbian GCC:

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

但是在Windows IDE + MinGW

中出错

我错过了一些严肃的事吗?动态链接lib只能由后面的可执行文件使用。我想也许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! 编译好了,谢谢大家。

1 个答案:

答案 0 :(得分:0)

看起来你的图书馆是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