如何将C ++目标文件链接到C可执行文件?

时间:2017-11-01 15:40:52

标签: c++ c makefile

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

我可以使用g ++来链接它们并不是那么明显。不,主要调用一些c libs所以我不能用g ++链接它们。所以我必须将它们与gcc联系起来。 我尝试了以下几点:

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

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

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

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

这实际上就是我想要的吗?或者我错过了什么?

2 个答案:

答案 0 :(得分:2)

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

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

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

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

答案 1 :(得分:1)

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

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