微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

G++ 链接器阶段失败,但库中的符号

如何解决G++ 链接器阶段失败,但库中的符号

我如何告诉链接器如何找到这些符号? (TL;DR 见文末)

我正在尝试让另一个 pgmer 的 C++ 代码在我的 Linux (Mint 20.1) 系统上运行。这段代码是在 Windows 上用 MS Visual C++ 编写的,但作者分发了源代码一个 Makefile,以便在包括 Linux 在内的各种操作系统上进行编译。 这段代码 (allcalc.cpp) 调用了作者库中的一些函数(windows 上的 dds.dll,linux 上的 libdds.a)。我已经使用 g++(版本 9)构建了 libdds.a 以获取一系列 .o 文件,并使用提供的 Makefile 创建了一个存档 libdds.a。 dds 与作者提供的一些示例一起正常工作。 (我还使用 g++ 编译并链接到 libdds.a)。 但是一个程序,不链接;它编译正常,但是当我运行链接阶段时,我得到 /usr/bin/ld: /tmp/allcalc.t5SuU8.ltrans0.ltrans.o: in function "main": <artificial>:(.text.startup+0x79f): undefined reference to "CalcAllTables" /usr/bin/ld: <artificial>:(.text.startup+0xb6e): undefined reference to "Par" collect2: error: ld returned 1 exit status make: *** [Makefile:44: allcalc] Error 1

产生上述错误信息的make cmd是: g++ -O3 -flto -fopenmp -mtune=corei7 -Wshadow <snip many -W flags> -Wno-format -I../include -L. -ldds -o allcalc allcalc.o (注意:libdds.a 与源文件和 .o 文件在同一目录中)

但是,当我运行 nm libdds.a 时会出现这两个符号(Par 和 CalcAllTables),而当我运行 ar -t libdds.a cmd 时也会出现相关的 .o 文件。 有问题的两个符号在 .h 文件(包含在 .cpp 文件中)中定义为(例如)EXTERN_C DLLEXPORT int STDCALL CalcAllTables( struct ddTableDeals * dealsp,int mode,int trumpFilter[DDS_STRAINS],struct ddTablesRes * resp,struct allParResults * presp);,其中第一行最终解析为: extern "C" int CalcAllTables(。 所以看起来defs在源中,代码在库中,但链接器找不到它们。我联系了作者,他很有帮助,但他不“做”Linux,所以他无法提出这个错误的原因。

如何告诉链接器如何找到这些符号?

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。