首页 > 解决方案 > 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 文件位于同一目录中)

但是,当我运行 a 时,这两个符号(Par 和 CalcAllTables)确实出现了,而当我运行cmdnm libdds.a时,相关的 .o 文件也出现了。ar -t libdds.a有问题的两个符号在 .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,所以他无法提出这个错误的原因。

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

标签: linuxvisual-c++linkerg++

解决方案


推荐阅读