我已将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(如果有所不同)。

最佳答案

如果确实需要一个无需使用-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 ++代码会更好,因为它知道所有正确的路径,并且不会犯任何小错误,从而导致二进制文件表面上看起来可以工作,但实际上是不正确的。



使用乔什的建议,您可以执行以下操作:

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


这样比较干净,可以很容易地在Makefile中完成。

关于c++ - lstd++和extern-从C调用C++,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/35384187/

10-13 00:05