【问题标题】:how to link a c++ library to a c++ source code when it has a specific linker script to compile? [closed]当有特定的链接器脚本要编译时,如何将 c++ 库链接到 c++ 源代码? [关闭]
【发布时间】:2021-11-27 13:52:24
【问题描述】:

我有这些文件:-

/lib
    kernel.hpp
    kernel.cpp
main.cpp

当我使用时

gcc -m32 -c main.cpp -lstdc++ -o main.o -llib/kernel.hpp

它说

[function name]([type of argument 1], [type of argument 2]) is not declared in this scope

如何解决?

【问题讨论】:

  • 你想使用类似 `gcc -m32 -c main.cpp -o main.o -Ilib' 来将 main.cpp 编译成 main.o。然后,您需要一个不同的命令来将 main.o 与您需要的所有其他内容(kernel.o、libstdc++)链接起来。你得到的命令很混乱。您了解编译和链接之间的区别吗? (这里不是刻薄,这是一个诚实的问题)
  • @user888379 ,当我整理我的内核源代码时,我注意到来自外部用户制作的库的函数无法识别。我需要解决这个问题。就这样。我明白你不是在这里刻薄。我确实理解编译和链接之间的区别。
  • 所以,kernel.hpp 是一个头文件,是 main.cpp 编译所必需的。这就是为什么我建议使用 -I 标志来编译 main.cpp。编译 main.o 时无需担心链接器标志。 kernel.cpp 也需要被编译,提供 kernel.o、libkernel.a 或 libkernel.so。让我们保持简单,说你有一个 kernel.o。然后,您可以将 main.o kernel.o 和您的 main 所需的任何库链接在一起。
  • 请注意,我使用的是 c++,具有函数重载。
  • 或者至少告诉我如何让 gcc 更改重载函数的名称。因为名称在 kernel.o 中发生了变化

标签: c++ gcc kernel ld i386


【解决方案1】:

我开始写评论,但太长了,所以我们将它作为一个答案。我认为它实际上不会回答您的问题,但它可能会为您指明正确的方向。

让我们澄清一个误解,c++ 不是 c 的超集;有 c++ 不支持的 c 构造。如果您的代码是 c++,则需要使用 c++ 编译器对其进行编译。您所描述的问题都表明编译失败;您不在涉及链接器的地步。您在问题中提供的编译命令有一个 -c 标志,它告诉编译器在编译步骤后停止 - 所以另外有一个 -lstd++ 标志是没有意义的。要让编译器找到 kernel.hpp,您需要一个 -I 标志,它指示可以找到 kernel.hpp 的目录。这就是我在第一条评论中的建议。

总而言之,如原始问题所示,您使用了错误的编译器和错误的标志来执行您想做的事情。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-06-03
    • 2023-04-01
    • 2013-07-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-22
    相关资源
    最近更新 更多