链接器错误,使用 g++ 链接到由 gcc 编译的库,未定义对该函数的引用

Posted

技术标签:

【中文标题】链接器错误,使用 g++ 链接到由 gcc 编译的库,未定义对该函数的引用【英文标题】:Linker error, using g++ to link to a library compiled by gcc, undefined reference to that function 【发布时间】:2015-06-20 16:20:47 【问题描述】:

我写了一个C函数,它调用openssl/sha.h中定义的函数,假设声明是"helper.h",实现是"helper.c"。然后我使用gcc编译了该函数并将其放入库中:

gcc -std=c99 -lcrypto -lssl -c helper.c -o helper.o
ar -rc helper.a helper.o

然后我写了一个cpp函数,调用"helper.h"中声明的函数。我加了

extern "C" 
#include "helper.h"
 

cpp 文件中的东西,然后我使用了

g++ test.cpp helper.a -o cpp

然后发生 ld 错误并说我遇到openssl/sha.h 中定义的函数的未定义引用。我想知道如何解决这个问题?

【问题讨论】:

-lssl 也添加到第二个 gcc 命令中。 请注意,第一个命令的-l 选项将被忽略,因为没有完成链接。 @riodoro1 我试过了,还是不行 @Quentin 是的,我用nm 检查了helper.a,似乎sha.h 中定义的函数标记为U。你知道如何解决这个问题吗? @shihanlin9 这很正常,sice helper.a 使用它们,但它们是在 libssl 中定义的。请定义“不起作用”,因为应该将-lssl 添加到您的最终链接命令中。 【参考方案1】:

sslcrypto 库添加到您的最终命令中,以便将这些库链接到您的程序。

您还必须遵守顺序:由于sll 使用的是crypto,因此您必须将ssl 放在首位,crypto 放在后面。

g++ test.cpp helper.a -o cpp -lssl -lcrypto

【讨论】:

行得通!我应该将-lcrypto -lssl 放在helper.a 之后似乎是一个顺序问题。链接到 -lpthread 等静态库时应该记住什么?我没有太多处理静态库的经验,我之前所做的只是链接一些目标文件:-)

以上是关于链接器错误,使用 g++ 链接到由 gcc 编译的库,未定义对该函数的引用的主要内容,如果未能解决你的问题,请参考以下文章

计算机系统篇之链接:gcc/g++的编译流程

计算机系统篇之链接:gcc/g++的编译流程

带有 -mavx 标志的链接器错误 GCC7

学习记录:gcc/g++ 编译与链接

Mac 上的 G++ 链接时优化 - 编译器/链接器错误?

跨 g++ 编译器链接器错误