检查“与外部库链接”示例时的矛盾结果
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
选项的情况下找到它,因为它知道搜索这些位置。以上是关于检查“与外部库链接”示例时的矛盾结果的主要内容,如果未能解决你的问题,请参考以下文章
Elasticsearch7.7设置账号密码时的逻辑矛盾问题
Elasticsearch7.7设置账号密码时的逻辑矛盾问题