linux - 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,所以他无法提出这个错误的原因。
我如何告诉链接器如何找到这些符号?
解决方案
推荐阅读
- json - 访问嵌套的json对象角度6
- spring-boot - springboot 在本地运行云配置文件
- python - Flask 应用程序 + uwsgi 提供的 Tensorflow.keras.Model 卡在 model.predict 中
- javascript - 如何为chart.js 使用这个新扩展?
- c++ - 在 C++ 中使用字符串时在线编译器出现运行时错误
- mongodb - 恢复 mongodb `--dbpath`
- python - 重命名在另一个模型中用作超类的模型
- c# - 将“WebView 6.0.0”添加到项目时出错
- listview - Flutter ListView 不使用 setState() 刷新 UI,尽管 itemCount 和附加列表正确更新
- .net - 在没有 DLL 的项目中包含 Newtonsoft Json.NET