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 (将#修改为@)