提问人:Daniel Melendrez 提问时间:11/6/2023 更新时间:11/6/2023 访问量:41
Codelite 中 msys2 mingw64 包库 (libserialport) 的链接器问题 - 未定义的参考
Linker issues with msys2 mingw64 package library (libserialport) in Codelite - undefined reference
问:
我正在使用通过 msys2 安装的 libserialport 库运行一些非常简单的实验,但是,无论我在项目设置中设置什么配置,我都会遇到链接问题。我正在使用 msys2 的最新版本的 gcc 13.2 进行编译。
我已确认库文件位于正确的目录中:
C:\msys64\mingw64\lib
:libserialport.a
C:\msys64\mingw64\include
:libserialport.h
C:\msys64\mingw64\bin
: libserialport-0.dll
对于更有经验的人来说,我肯定可能会错过一些明显的东西。
[注意]我知道这篇文章,但是,将 Makefile 生成器更改为仅“Make”或 Codelite 的不起作用(编译卡住了。也许我做错了什么:/ )
:啤酒:
正如我所提到的,我已经尝试了多种设置组合(这些不是我尝试过的唯一设置。我指向了dll,进行了链接等):-static
此外,我的环境变量指向该位置的正确文件夹(因此其他项目工作正常)mingw64
请注意,我的 Codelite 与其他项目完美配合。此外,我的 msys2 系统是最新的,其他贡献的库运行良好(并非所有库都经过测试,但到目前为止没有链接问题)。
如果它有效,我正在使用他们 wiki 页面中的示例进行测试:list_ports.c
#include <libserialport.h>
#include <stdio.h>
/* Example of how to get a list of serial ports on the system.
*
* This example file is released to the public domain. */
int main(int argc, char **argv)
{
/* A pointer to a null-terminated array of pointers to
* struct sp_port, which will contain the ports found.*/
struct sp_port **port_list;
printf("Getting port list.\n");
/* Call sp_list_ports() to get the ports. The port_list
* pointer will be updated to refer to the array created. */
enum sp_return result = sp_list_ports(&port_list);
if (result != SP_OK) {
printf("sp_list_ports() failed!\n");
return -1;
}
/* Iterate through the ports. When port_list[i] is NULL
* this indicates the end of the list. */
int i;
for (i = 0; port_list[i] != NULL; i++) {
struct sp_port *port = port_list[i];
/* Get the name of the port. */
char *port_name = sp_get_port_name(port);
printf("Found port: %s\n", port_name);
}
printf("Found %d ports.\n", i);
printf("Freeing port list.\n");
/* Free the array created by sp_list_ports(). */
sp_free_port_list(port_list);
/* Note that this will also free all the sp_port structures
* it points to. If you want to keep one of them (e.g. to
* use that port in the rest of your program), take a copy
* of it first using sp_copy_port(). */
return 0;
}
答:
感谢@stark为我找到正确的解决方案。我只需要将库包含在链接器中即可。把我弄傻了。
正如我在上一条评论中提到的,我注意到 CodeLite 中显然存在一个错误,但是,我不能再复制它了(墨菲定律?
不可重复的 bug 包括以下内容:
尽管在链接器选项中添加了对库的引用: ,但链接阶段仍然会失败。将设置从 更改为神奇地使我的错误消失了,程序构建和运行良好。-llibserialport
Makefile Generator
CodeLite Makefile Generator
Default
然后,将设置恢复到清理项目后,代码再次构建并运行,没有任何问题。CodeLite Makefile Generator
从现在开始,我相信我会为我的所有项目选择生成器,因为它似乎从一开始就起作用。Default
评论
-LC:\msys64\...
sp_list_ports
sp_get_port_name
sp_free_ports_list
-lserialport