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

lstd++ & extern - calling C++ from C

我已将我的 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++导致linker从link变为libstdc++,这是gcc对C++标准库的实现。如果您的代码使用标准库中的任何符号(它使用标准库,并且并非所有代码都从 headers 内联),则它必须 link libstdc++ (或您选择的任何标准库实现)使用)。

你可以避开标准库,或者你可以link针对系统标准库,或者你可以静态地link一个标准库的副本到你的程序中。

如果你真的需要一个你可以link使用gcc而不使用-lstdc++的目标文件,你可以增量link你的 C++ 目标文件与 -lstdc++ 然后在你的 gcc link 行上使用它的结果。类似于:

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

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

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

找到它

你通常最好使用 g++ 到 link C++ 代码,因为它知道所有正确的路径并且不会犯小错误导致二进制文件表面上看起来像工作,但实际上是不正确的。


根据 Josh 的建议,您可以:

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

这更简洁一些,可以很容易地在 Makefile 中完成。