多个定义,包括开源库(具有看似正确的链接器设置?)
Multible definitions including open source library (with seemingly correct linker settings?)
我正在开发一个使用开源库的学习程序。它意味着在 Raspberry Pi(Raspbian 内核)上 运行。因为我打算也能够将它加载到 PLC 上,所以我主要使用纯 C。库本身带有合适的 header 和 .c 文件。
当我在 Raspberry 上使用预安装的 GCC 编译器时,我的程序编译没有任何错误并且工作正常。现在我的问题来了:
我试图让这个项目在 windows 上使用 code::blocks IDE 并安装了 MinGW。我重新访问了库并下载了 windows 的 zip(显然是相同的 header 和 .c 文件,但也包括 .lib 和 .dll)。
我在项目中设置了搜索目录和 linker 设置,并像往常一样包含 header 和 #include "header.h"
作为相对路径。它不会编译并给出很多 multible definition
和 first defined here
,这通常表示错误的 linking 和包含。
当我试图识别其中的一些定义时,我注意到导致错误的函数在 library.c 文件中定义了一次。在此 .c 文件的开头,它还包含一次 header。
简短摘要:
这适用于 raspbian GCC:
$ gcc -sdt=c99 main.c library.c -o executable
但在 Windows IDE + MinGW
时出错
我是不是漏掉了什么严重的东西?动态 link 库只能由之后的可执行文件使用。我认为 libraby.c
可能会被 library.lib
取代,但如果我删除其中一个,项目将不知道这些功能。我还搜索了错误的内含物。我真的是无所适从,还搜索了对我有帮助的帖子,但这些帖子大多是 "where is the linker path" 或 "inclusion of .c files"。看似很简单的问题被我忽略了。
如有任何帮助,我们将不胜感激。如果需要,我会提供更多详细信息。
谢谢!
编辑 (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。
有两种方法可以将库包含在您的源代码中:
- 构建一个 shared/static 库并将其link 添加到您的代码中
- 启用合并生成一个 .c 和 .h 文件,您可以直接用您的代码编译该文件
您在 mingw 上结合了这两种方法,这将整个库添加了两次。
可能您只想 link 没有 .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
我正在开发一个使用开源库的学习程序。它意味着在 Raspberry Pi(Raspbian 内核)上 运行。因为我打算也能够将它加载到 PLC 上,所以我主要使用纯 C。库本身带有合适的 header 和 .c 文件。
当我在 Raspberry 上使用预安装的 GCC 编译器时,我的程序编译没有任何错误并且工作正常。现在我的问题来了:
我试图让这个项目在 windows 上使用 code::blocks IDE 并安装了 MinGW。我重新访问了库并下载了 windows 的 zip(显然是相同的 header 和 .c 文件,但也包括 .lib 和 .dll)。
我在项目中设置了搜索目录和 linker 设置,并像往常一样包含 header 和 #include "header.h"
作为相对路径。它不会编译并给出很多 multible definition
和 first defined here
,这通常表示错误的 linking 和包含。
当我试图识别其中的一些定义时,我注意到导致错误的函数在 library.c 文件中定义了一次。在此 .c 文件的开头,它还包含一次 header。
简短摘要:
这适用于 raspbian GCC:
$ gcc -sdt=c99 main.c library.c -o executable
但在 Windows IDE + MinGW
时出错我是不是漏掉了什么严重的东西?动态 link 库只能由之后的可执行文件使用。我认为 libraby.c
可能会被 library.lib
取代,但如果我删除其中一个,项目将不知道这些功能。我还搜索了错误的内含物。我真的是无所适从,还搜索了对我有帮助的帖子,但这些帖子大多是 "where is the linker path" 或 "inclusion of .c files"。看似很简单的问题被我忽略了。
如有任何帮助,我们将不胜感激。如果需要,我会提供更多详细信息。 谢谢!
编辑 (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。
有两种方法可以将库包含在您的源代码中:
- 构建一个 shared/static 库并将其link 添加到您的代码中
- 启用合并生成一个 .c 和 .h 文件,您可以直接用您的代码编译该文件
您在 mingw 上结合了这两种方法,这将整个库添加了两次。 可能您只想 link 没有 .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