链接器错误,使用 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】:
将 ssl
和 crypto
库添加到您的最终命令中,以便将这些库链接到您的程序。
您还必须遵守顺序:由于sll
使用的是crypto
,因此您必须将ssl
放在首位,crypto
放在后面。
g++ test.cpp helper.a -o cpp -lssl -lcrypto
【讨论】:
行得通!我应该将-lcrypto -lssl
放在helper.a
之后似乎是一个顺序问题。链接到 -lpthread
等静态库时应该记住什么?我没有太多处理静态库的经验,我之前所做的只是链接一些目标文件:-)以上是关于链接器错误,使用 g++ 链接到由 gcc 编译的库,未定义对该函数的引用的主要内容,如果未能解决你的问题,请参考以下文章