【问题标题】:Linker error, using g++ to link to a library compiled by gcc, undefined reference to that function链接器错误,使用 g++ 链接到由 gcc 编译的库,未定义对该函数的引用
【发布时间】: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 添加到您的最终链接命令中。

标签: c++ c gcc linker


【解决方案1】:

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

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

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

【讨论】:

  • 行得通!我应该将-lcrypto -lssl 放在helper.a 之后似乎是一个顺序问题。链接到 -lpthread 等静态库时应该记住什么?我没有太多处理静态库的经验,我之前所做的只是链接一些目标文件:-)
猜你喜欢
  • 2013-09-04
  • 1970-01-01
  • 2014-03-04
  • 2012-10-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-08-29
  • 2016-02-12
相关资源
最近更新 更多