检查“与外部库链接”示例时的矛盾结果

Posted

技术标签:

【中文标题】检查“与外部库链接”示例时的矛盾结果【英文标题】:a contradictory result when checking an example of "Linking with external libraries" 【发布时间】:2015-06-20 17:04:31 【问题描述】:

我刚开始通过阅读“An introduction to GCC”学习gcc/g++

在第 3.1 章中,作者展示了一个链接外部库和头文件的示例。主要源代码使用“gdbm.h”头文件(安装在教科书的/opt/gdbm-1.8.3/include/)文件和库“libgdbm.a”(安装在/opt/gdbm-1.8.3/ lib/ 在教科书中)。与库和头文件的链接过程如下:

Link to example screenshot

当我试图重复这一点时,我得到了一个矛盾的结果。当我使用方法1(在示例中失败)只包含头文件路径时,程序可以编译,但是,当我使用方法2时(在示例中成功),我得到一个错误,说 “ld:架构 x86_64 的 1 个重复符号 clang:错误:链接器命令失败,退出代码为 1"

(这是我的完整命令行和错误信息:)

userMacBook-Pro:03 user$gcc -Wall -I/usr/local/include dbmain.c -L/usr/local/lib dbmain.c -lgdbm
duplicate symbol _main in:
/var/folders/6_/09vfzzms7dq1d73vl4mwlxmh0000gn/T/dbmain-9d15f9.o
/var/folders/6_/09vfzzms7dq1d73vl4mwlxmh0000gn/T/dbmain-907e96.o

这是我成功的命令:

userMacBook-Pro:03 user$ gcc -Wall -I/usr/local/include dbmain.c -lgdbm
userMacBook-Pro:03 user$ ./a.out
Storing key-value pair... done.

ld:架构 x86_64 的 1 个重复符号 clang:错误:链接器命令失败,退出代码为 1(使用 -v 查看调用)

谁能解释为什么会这样?

不知道作者用的是哪个平台,我就是用mac OS X。

【问题讨论】:

您需要显示完整的命令行和错误消息。 (尤其重要的是要知道哪个符号是重复的。) 嗨@EwanMellor 我添加了完整的命令行和错误消息。谢谢 【参考方案1】:

gcc -Wall -I/usr/local/include dbmain.c -L/usr/local/lib dbmain.c -lgdbm

文件dbmain.c 在您的命令行中出现两次。因此,main 函数出现了两次。

【讨论】:

嗯....这是我的错...谢谢。但是,我仍然可以使用教科书中失败的方法1编译成功 您的方法 1 成功,因为您将 libgdbm 安装在 gcc 默认搜索的路径中。本书使用 /opt 内的路径,默认情况下 gcc 不会搜索该路径,因此您需要 -L 选项。如果库位于 /usr/lib 或 /usr/local/lib 中,则 gcc 将在没有 -L 选项的情况下找到它,因为它知道搜索这些位置。

以上是关于检查“与外部库链接”示例时的矛盾结果的主要内容,如果未能解决你的问题,请参考以下文章

与 Wt 示例组合时的链接错误

vue-router应用于组件内时的矛盾怎么解决

Elasticsearch7.7设置账号密码时的逻辑矛盾问题

Elasticsearch7.7设置账号密码时的逻辑矛盾问题

Elasticsearch7.7设置账号密码时的逻辑矛盾问题

检查 Null 值时的结果不一致(Jet DAO 与 ACE DAO)