C++;简单的文件编译使用;gcc“;编译程序 我试图编译一个非常简单的C++代码,并根据GCC参数序列来获得链接错误。有人能解释一下这两个命令行之间的区别吗
//这个很好用C++;简单的文件编译使用;gcc“;编译程序 我试图编译一个非常简单的C++代码,并根据GCC参数序列来获得链接错误。有人能解释一下这两个命令行之间的区别吗,c++,gcc,static-linking,C++,Gcc,Static Linking,//这个很好用 gcc -x c++ -c *.h *.cpp (first I pass *.h files then *.cpp) gcc -lstdc++ *.o -o exe //这是一个错误 gcc -x c++ -c *.cpp *.h (first I pass *.cpp files then *.h) gcc -lstdc++ *.o -o exe gcc是否关心参数序列 示例: //这个箱子很好用 [karen@linux40 ~/C++]$ ls Employ
gcc -x c++ -c *.h *.cpp (first I pass *.h files then *.cpp)
gcc -lstdc++ *.o -o exe
//这是一个错误
gcc -x c++ -c *.cpp *.h (first I pass *.cpp files then *.h)
gcc -lstdc++ *.o -o exe
gcc是否关心参数序列
示例:
//这个箱子很好用
[karen@linux40 ~/C++]$ ls
Employee.cpp Employee.h Main.cpp
[karen@linux40 ~/C++]$ gcc -x c++ -c *.h *.cpp
[karen@linux40 ~/C++]$ ls
Employee.cpp Employee.h Employee.o Main.cpp Main.o Makefile
[karen@linux40 ~/C++]$ gcc -lstdc++ *.o -o exe
[karen@linux40 ~/C++]$ ls
exe Employee.cpp Employee.h Employee.o Main.cpp Main.o
Main.cpp
#include "Employee.h"
int main() {
Employee e;
return 0;
}
我假设提问者在非标准位置使用头,因此将它们显式地传递给编译器。如果*.c中的代码需要*.h才能工作,那么在代码之后传入头将给出一个错误,而相反的顺序没有 如果您将标题包含在
#include <file.h>
而是用于与代码位于同一目录中的标题。如果它们在其他地方,请添加
-I /path/to/headers/
到gcc命令
祝你好运 通常不应将.h文件直接传递给编译器。这没有任何意义,也不正确 但这里的问题似乎主要是为了理解gcc是如何工作的。所以我的答案是从这个角度 我假设您在.cpp文件中包含相同的.h文件 当您先传递.cpp,然后传递.h时,编译器会看到一个声明,然后是定义,然后是声明。这会导致链接器错误,因为第二个声明没有相应的定义
相反,如果先传递.h,然后传递.cpp,它会看到两个声明,然后是定义,链接很好。不应该将.h文件传递给gcc。什么是“错误”?另外,您的
*.h
文件中有哪些内容必须显式地提供给编译器?是的,它确实关心链接库的顺序,尽管这与您的错误并不完全相关,但有点与您的问题相关是的,我同意您的看法。我不需要传递“.h”文件。但为什么gcc在我们首先传递“.h”然后是“.cpp”文件时会感觉到find,反之亦然?要查看错误消息,请查看我的更新数据。谢谢Karen@CollinHockey这是一个蹩脚的评论,太糟糕了,我们不能否决这些评论。我认为格里吉是出于礼貌…(+1)纠正了这个问题。非常合乎逻辑的解释。。。谢谢你,卡伦请看我的附加代码。实际上,我使用了“”而不是感谢KarenSo,您的头文件是否与代码位于同一目录中?如果是这样,完全去掉“*.h”应该是正确的。是的,完全正确!它们在同一个目录中。我已经更新了问题描述,您可以看到shell命令“ls”的结果,它显示我在同一目录中有三个文件。谢谢你的关注和帮助。我已经编译了你的代码,如果我在命令末尾加上“.h”,我会得到与你相同的错误。以前的回答者解释了它为什么失败,但是为了使它工作,你只需要省略'.h ':'Gcc-xC++ +c*.cp'。
#include "Employee.h"
int main() {
Employee e;
return 0;
}
#include <file.h>
#include "file.h"
-I /path/to/headers/