我在C++下编译c和C++文件的混合。正如在: What is the difference between g++ and gcc?将g ++迁移到gcc
c文件正在编译为C++与g ++命令行。不是很大的问题,但是迁移到gcc将允许将c文件编译为c文件,并将C++文件编译为C++。
什么-I包括或-L库需要添加到gcc命令行,g ++命令行默认包含?
我在C++下编译c和C++文件的混合。正如在: What is the difference between g++ and gcc?将g ++迁移到gcc
c文件正在编译为C++与g ++命令行。不是很大的问题,但是迁移到gcc将允许将c文件编译为c文件,并将C++文件编译为C++。
什么-I包括或-L库需要添加到gcc命令行,g ++命令行默认包含?
您不应该需要添加任何。如果它使用C++,它应该自动引入C++库。
如果没有,你会想要-lstdC++(如果你仍然得到未定义的引用,-lc为libc)。不要忘记 - 如果你使用数学函数。
您应该不需要添加任何包含或超出您已有的库。
对于从C++代码中调用的C函数有什么意义 - 您需要告诉C++编译器那些是C函数,以便程序正确链接并工作。
标准的做法是以下指令添加到您所有的C头文件被包含在C++文件:
#ifdef __cplusplus
extern "C" {
#endif
... C header contents go here ...
#ifdef __cplusplus
}
#endif
此处了解详情:http://www.parashift.com/c++-faq-lite/mixing-c-and-cpp.html
需要包含链接器命令的-lstdC++。 – simon 2009-08-24 22:30:15
为什么不能编译,用gcc和的C对象C++与g ++,然后当你链接,使用g ++链接?
我可能可以,但我有一个相当复杂的现有makefile,来自第三方的源代码,我不想与之混淆。 – simon 2009-08-24 22:31:56
GCC可以根据文件扩展名确定文件所处的语言。然而,GCC不会自动运行时支持链接以C以外的任何语言在实践中,这意味着你可以使用gcc
代替g++
编译C++程序,但你需要添加-lstdc++
指令:
#include <iostream>
int main()
{
std::cout << "Hello world\n";
}
g++ hello.cc
gcc hello.cc -lstdc++
更准确的说,你需要,如果你使用标准库,异常操作new
,或RTTI指定-lstdc++
。例如,尝试编译没有-lstdc++
如下:
int main()
{
try {
throw 1;
}
catch (int i)
{
return i;
}
}
请注意,STL容器(包括std::string
S)默认使用运营商new
。严格地说,你应该能够在没有-lstdc++
的标准库中使用算法(std::min
,std::find_first_of
,std::find_first_of
等)活页夹和其他一些东西,但大多数情况下你可能还会包含它(链接器将忽略任何库不实际链接到)。
那种 - 有道理。因为你使用的是C++标准库(std :: cout),所以显然你应该将它包含在命令行中。真正的问题是为什么你在普通的旧C中使用C++标准库? – 2009-08-24 22:01:41
@Gerco Dries:C和C++仍然有int main。你在评论中想说什么? – 2009-08-24 22:42:40
@Greco,你会注意到这个问题的最后一句话是“我需要在gcc命令行中添加什么-I包含或-L库,g ++命令行默认包含?”我理解的意思是“如果我有C++代码,并且我想用GCC进行编译,那么需要通过哪些开关才能工作?”所以,是的,这两个程序片段都是C++片段,用GCC编译它们需要添加命令行开关-lstdC++。 – 2009-08-25 16:51:43
需要在链接器命令中包含-lstdC++。 – simon 2009-08-24 22:30:46