Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/150.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++;简单的文件编译使用;gcc“;编译程序 我试图编译一个非常简单的C++代码,并根据GCC参数序列来获得链接错误。有人能解释一下这两个命令行之间的区别吗_C++_Gcc_Static Linking - Fatal编程技术网

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/