【问题标题】:how do I link a C++ object file to a C executable? [duplicate]如何将 C++ 目标文件链接到 C 可执行文件? [复制]
【发布时间】:2018-04-13 23:41:51
【问题描述】:

我正在尝试从 C 文件调用 C++ 函数。 所以我将该函数声明为 extern "C" 并在 C 文件中声明它。 从 cpp 文件创建了一个目标文件,我们称之为 cpp_object.o,然后为 main.c 创建一个目标文件。

我可以使用 g++ 链接它们并不是那么明显。不,main 调用了一些 c 库,所以我无法将它们与 g++ 链接。所以我必须将它们与 gcc 链接起来。 我尝试了以下方法:

main: main.o cpp_object.o
    ${CROSS}${CC} $^ -o $@ ${LDFLAGS}

显示目标文件找不到 C++ 标准库的错误。我不知道发生了什么。谷歌搜索它尝试了以下方法:

main: main.o get_config.o
    ${CROSS}${CC} $^ -o $@ ${LDFLAGS}  -lstdc++

然后它起作用了!?这是否意味着 gcc 使用 c++ stdlib 编译代码?但是我有点困惑,我们需要如何用 c++ stl 编译 C 代码?

所以这真的是我想要的吗?还是我错过了什么?

【问题讨论】:

  • 为什么你认为 C 代码需要 C++ STL?假设 C++ 函数需要 C++ STL 更有意义。
  • @nwp 嗨。我想说的是C文件调用的C++函数需要stl。但我的问题是这个选项是否意味着 gcc 用 stl 编译 C 代码?
  • main.o 不是 C 代码。您是在链接,而不是在编译。

标签: c++ c makefile


【解决方案1】:

您链接的 C++ 对象需要 C++ 库。

如果您使用 C 驱动程序链接(例如:gcc),您需要添加到 C++ 库的链接,因为这个 C++ 对象,而不是因为 C 对象。 C 驱动程序不了解 C++。

如果您与 C++ 驱动程序链接(例如:g++),则默认设置 C++ 库(您无需将其添加到链接选项中)

注意此时所有对象都编译完成,阶段为link阶段。

【讨论】:

  • 谢谢。我认为stl已经编译到目标文件中。为什么在链接时它们仍然是必需的?
  • 如您所描述的,大部分 std:: 库都“编译到目标文件中”(因为它们主要是模板头文件),但这些头文件又调用 std lib 中的函数.因此,有东西可以链接。 (例如“新建和删除”)。
  • @selbie 好吧。似乎我学到了一些新东西。谢谢。
【解决方案2】:

很可能,您只需要使用 C++ 编译器来启动最终链接。通过这样做,所有正确的链接参数都将传递给链接器。

main: main.o get_config.o
    ${CROSS}${CXX} $^ -o $@ ${LDFLAGS}

【讨论】:

  • 嘿。我无法将其编译为 cpp 文件。因为实际上 main.c 调用了其他 c 库。如果我用 g++ 编译 main.c,我会遇到数千个错误......
  • 我不是说用 c++ 编译器编译 .c 文件,我是说所有生成的 .o 文件都通过调用链接:g++ -o main main.o get_config.o。在这种情况下,无需“编译”任何内容,C++ 编译器将依次调用带有正确参数的链接器。
  • 嗨。抱歉,这是我的错误,我想说它是在链接阶段我有一个动态的 c lib 与 main 链接。行得通吗?
  • 很有可能。链接独立于编程语言。只是编译器只是使用正确的标志和参数为您调用链接器。所以我建议如果您的 Makefile 将使用正确的编译器将所有内容编译为 .o,那么您可以链接所有 .o 文件并使用 c++ 将正确的 C++ 库传递给链接器编译器。
  • 谢谢。我对链接过程不太了解。我认为这取决于语言。但是如果事情如你所说,g ++链接器和gcc链接器有什么区别?他们实际上都调用 ld 只是使用不同的默认参数吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2010-12-23
  • 1970-01-01
  • 1970-01-01
  • 2014-03-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多