我正在为我的研究开发一个程序,它使用开源库。它意味着在Raspberry Pi(Raspbian Kernel(上运行。由于我打算也能够在PLC上加载它,所以我主要使用纯C。库本身带有合适的头文件和.c文件。
当我在树莓上使用预安装的 GCC 编译器时,我的程序编译没有任何错误并且工作正常。现在我的问题来了:
我试图让这个项目使用安装了MinGW的代码::blocks IDE在Windows上工作。我重新访问了库并下载了 windows 的 zip(非常相同的标头和 .c 文件,但也包括 .lib 和 .dll(。
我在项目中设置了搜索目录和链接器设置,并像往常一样包含标头,并#include "header.h"
相对路径。它不会编译,并且提供了很多multible definition
和first defined here
,这通常表示错误的链接和包含。
当我试图识别其中一些定义时,我注意到导致错误的函数在library.c文件中定义过一次。在此.c文件的开头,它还包含一次标头。
简短摘要:
这适用于 raspbian GCC:
$ gcc -sdt=c99 main.c library.c -o executable
但给出Windows IDE + MinGW的错误
我错过了什么严重的事情吗?动态链接库只能由可执行文件使用。我想也许libraby.c
被library.lib
取代,但如果我删除其中一个,项目就不知道功能了。我还搜索了错误的内含物。我在这里的知识真的到了尽头,并且还搜索了对我有帮助的帖子,但这些帖子主要是"链接器路径在哪里"或"包含 .c 文件"。这似乎是我忽略的一个简单的问题。
任何帮助都会得到赞赏。如果需要,我将提供更多细节。 谢谢!
编辑 (2(:
objDebugopen62541.o:open62541.c:(.text+0x3152a): undefined reference to `__imp_shutdown'
objDebugopen62541.o:open62541.c:(.text+0x3153f): undefined reference to `__imp_closesocket'
objDebugopen62541.o:open62541.c:(.text+0x315a7): undefined reference to `__imp_send'
objDebugopen62541.o:open62541.c:(.text+0x315b9): undefined reference to `__imp_WSAGetLastError'
.....
编辑 (3(
答案1! 现在编译好了,谢谢大家。
看起来您的库已打开62541。
有两种方法可以将库包含在源中:
- 构建一个共享/静态库并将其链接到您的代码
- 启用合并,它会生成一个 .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