【问题标题】:How to suppress undefined symbol error in C++?如何抑制 C++ 中的未定义符号错误?
【发布时间】:2020-11-12 17:00:31
【问题描述】:

我正在寻找一种在编译时未定义符号时抑制/满足链接器的方法。 为了说明我要完成的工作,我将举一个简单的例子:

CoreCpp.h 文件:

#include <stdio.h>

int calculate();

CoreCpp.cpp 文件:

#include "CoreCPP.h"

int calculate(){
    return 0;
}

使用上面的这两个文件,我将创建一个 .a 静态库。

然后我将在 Xcode 中创建一个简单的命令行项目,如下图所示:

如果我链接静态库,项目将毫无问题地编译:

但是,如果我不链接静态库,则会抛出未定义符号错误。

Undefined symbols for architecture x86_64:
"calculate()", referenced from:
    _main in main.o
ld: symbol(s) not found for architecture x86_64

问题:有没有办法可以抑制错误或以某种方式使链接器在编译时满意?我们可以在这里应用弱链接的概念吗?

【问题讨论】:

  • 我不明白弱链接的概念在这里如何适用。
  • 您似乎在询问动态链接,当您为静态链接编译库时,这是不可能的。
  • @Eljay,我可能不正确。我有 Objective C 背景,在 Objective C 中有一个叫做弱链接或可选链接的概念。
  • @zfgo __attribute__((weak_import)) 也应该在 C++ 中工作,但它通常与动态链接库一起使用,而不是静态链接库(尽管显然你可以让它与后者一起使用)。见this question
  • 如果您能解释您想要实现的目标以及为什么动态链接不适合您,将会很有帮助。

标签: c++ xcode static-libraries


【解决方案1】:

我对 Xcode 不熟悉,但是它的编译/链接过程应该和 Eclipse 类似。所以首先你应该了解compilationlinkingbuilding之间的区别。然后您还应该意识到有两种方法可以构建您的项目:分别编译您的源代码文件,然后将它们链接在一起以获得机器可执行指令,或者在一个步骤/命令中编译链接。仅在编译步骤中,您可以获得静态或动态库的输出,或 .o 目标文件,稍后将在链接步骤中使用。通过单独的编译/链接步骤,您可以更好地控制 构建 过程。当您构建项目时,Eclipse(以及据称是 Xcode)正在做的事情是这两种方式中的任何一种,具体取决于您的项目设置。如果您想完全控制在 Eclipse 或您拥有的任何 IDE 中构建的过程,您应该注意您的项目设置,或者更好地将其设置为使用Makefile,您可以在其中准确定义您的源代码应该如何编译和链接以及在哪些步骤/顺序中。在 Eclipse 中,您需要创建一个 Makefile-project 并在项目文件旁边编辑您的 Makefile

在你上面的这个问题中,你试图做的(或寻求帮助)是强制 IDE build 你的项目而不指定库,显然你的 linker 在抱怨。相反,如果您指定库,它就不会再抱怨了。但是请注意,您应该确保您的 IDE 设置可以在更改时从源代码(重新)编译您的库,否则您最终可能会将已编译库文件的旧版本与您的 main.cpp 和其他文件链接起来。

【讨论】:

    猜你喜欢
    • 2018-01-21
    • 1970-01-01
    • 2014-06-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多