2009-08-24 80 views
1

我在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 ++命令行默认包含?

回答

1

不应该需要添加任何。如果它使用C++,它应该自动引入C++库。

如果没有,你会想要-lstdC++(如果你仍然得到未定义的引用,-lc为libc)。不要忘记 - 如果你使用数学函数。

+1

需要在链接器命令中包含-lstdC++。 – simon 2009-08-24 22:30:46

4

您应该不需要添加任何包含或超出您已有的库。

对于从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

+4

需要包含链接器命令的-lstdC++。 – simon 2009-08-24 22:30:15

0

为什么不能编译,用gcc和的C对象C++与g ++,然后当你链接,使用g ++链接?

+0

我可能可以,但我有一个相当复杂的现有makefile,来自第三方的源代码,我不想与之混淆。 – simon 2009-08-24 22:31:56

1

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_ofstd::find_first_of等)活页夹和其他一些东西,但大多数情况下你可能还会包含它(链接器将忽略任何库不实际链接到)。

+0

那种 - 有道理。因为你使用的是C++标准库(std :: cout),所以显然你应该将它包含在命令行中。真正的问题是为什么你在普通的旧C中使用C++标准库? – 2009-08-24 22:01:41

+0

@Gerco Dries:C和C++仍然有int main。你在评论中想说什么? – 2009-08-24 22:42:40

+0

@Greco,你会注意到这个问题的最后一句话是“我需要在gcc命令行中添加什么-I包含或-L库,g ++命令行默认包含?”我理解的意思是“如果我有C++代码,并且我想用GCC进行编译,那么需要通过哪些开关才能工作?”所以,是的,这两个程序片段都是C++片段,用GCC编译它们需要添加命令行开关-lstdC++。 – 2009-08-25 16:51:43