lstd ++& extern - 从C调用C ++

时间:2016-02-13 19:11:54

标签: c++ c extern

我已将C ++头文件包装在extern“C”块中,以允许从C调用C ++函数。我已将适当的头文件包含在适当的位置。如果我执行以下操作,它会起作用:

g++ -c cpp_src.cc
gcc -c c_src.c
gcc -o c_exe c_src.o cpp_src.o -lstdc++

但是如果我从最后一行删除-lstdc ++,我会收到一堆错误。由于我无法控制的原因,我无法添加-lstdc ++标志。有没有办法让没有-lstdc ++的上述工作?究竟什么是lstdc ++,就像gcc在与g ++编译代码链接时如何使用它一样?

此外,cpp_src.cc使用STL,如果这有所不同。

2 个答案:

答案 0 :(得分:4)

如果确实需要有一个可以在不使用-lstdc ++的情况下与gcc链接的目标文件,那么可以使用-lstdc ++对C ++目标文件进行增量链接,然后使用结果在你的gcc链接线上。类似的东西:

ld -i -static cpp_src.o -L/usr/lib/gcc/x86_64-linux-gnu/4.8 -lstdc++ -o cpp_withstdlib.o

这将链接您的C ++目标文件与标准C ++库并生成一个新的目标文件(cpp_withstdlib.o),其中包含您需要的所有标准C ++库,因此可以在gcc命令行上链接而无需-lstdc++

棘手的部分是-L选项 - 你需要弄清楚g ++在哪里藏匿了它的标准库,因为它通常不会把它放在标准的/usr/lib位置。以上是针对Ubuntu 14.04的机器。在大多数Linux机器上,您可以使用locate libstdc++.a

找到它

您通常最好使用g++来链接C ++代码,因为它知道所有正确的路径,并且不会犯一些错误,从而导致表面看起来有效的二进制文件,但实际上是不正确的。

使用Josh的建议,你可以这样做:

ld -i -static cpp_src.o `g++ -print-file-name=libstdc++.a` -o cpp_withstdlib.o

有点干净,可以在Makefile中轻松完成。

答案 1 :(得分:2)

-lstdc++使链接器链接到libstdc++,这是gcc对C ++标准库的实现。如果您的代码使用标准库中的任何符号(它使用标准库,而不是所有代码都是从头文件内联),则必须链接libstdc++(或您使用的任何标准库实现)。

您可以避开标准库,也可以链接系统标准库,也可以将标准库的副本静态链接到程序中。