Codelite 中 msys2 mingw64 包库 (libserialport) 的链接器问题 - 未定义的参考

Linker issues with msys2 mingw64 package library (libserialport) in Codelite - undefined reference

提问人:Daniel Melendrez 提问时间:11/6/2023 更新时间:11/6/2023 访问量:41

问:

我正在使用通过 msys2 安装的 libserialport 库运行一些非常简单的实验,但是,无论我在项目设置中设置什么配置,我都会遇到链接问题。我正在使用 msys2 的最新版本的 gcc 13.2 进行编译。

linking issues

我已确认库文件位于正确的目录中:

C:\msys64\mingw64\lib:libserialport.a

C:\msys64\mingw64\include:libserialport.h

C:\msys64\mingw64\bin: libserialport-0.dll

对于更有经验的人来说,我肯定可能会错过一些明显的东西。

[注意]我知道这篇文章,但是,将 Makefile 生成器更改为仅“Make”或 Codelite 的不起作用(编译卡住了。也许我做错了什么:/ )

:啤酒:

正如我所提到的,我已经尝试了多种设置组合(这些不是我尝试过的唯一设置。我指向了dll,进行了链接等):-static

compiler settings linker settings

此外,我的环境变量指向该位置的正确文件夹(因此其他项目工作正常)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;
}
c gcc linker-errors msys2 codelite

评论

1赞 HolyBlackCat 11/6/2023
删除这些标志。如果您使用的是正确的编译器,则将自动搜索这些目录。如果在执行此操作后出现错误,则说明您没有使用应该使用的编译器。-LC:\msys64\...
0赞 Daniel Melendrez 11/6/2023
@HolyBlackCat是的,正如我所提到的,我一开始尝试过,但它不起作用。我仍然有链接问题:“未定义对 , , 的引用”。还有其他想法吗?干杯sp_list_portssp_get_port_namesp_free_ports_list
2赞 stark 11/6/2023
您没有列出任何库。
1赞 HolyBlackCat 11/6/2023
“你没有列出任何库。”现在我觉得自己很傻。你需要。-lserialport
1赞 stark 11/6/2023
这回答了你的问题吗?什么是未定义的引用/未解析的外部符号错误,如何解决?

答:

0赞 Daniel Melendrez 11/6/2023 #1

感谢@stark为我找到正确的解决方案。我只需要将库包含在链接器中即可。把我弄傻了。

正如我在上一条评论中提到的,我注意到 CodeLite 中显然存在一个错误,但是,我不能再复制它了(墨菲定律?

不可重复的 bug 包括以下内容:

尽管在链接器选项中添加了对库的引用: ,但链接阶段仍然会失败。将设置从 更改为神奇地使我的错误消失了,程序构建和运行良好。-llibserialportMakefile GeneratorCodeLite Makefile GeneratorDefault

successful execution

然后,将设置恢复到清理项目后,代码再次构建并运行,没有任何问题。CodeLite Makefile Generator

从现在开始,我相信我会为我的所有项目选择生成器,因为它似乎从一开始就起作用。Default