【发布时间】:2012-03-21 00:21:06
【问题描述】:
我正在尝试编译一个非常简单的 c++ 代码并根据 gcc 参数的顺序得到一个链接错误。谁能解释这两个命令行行之间有什么区别?
// 这很好用
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// 这是有问题的案例
[karen@linux40 ~/C++]$ ls Employee.cpp Employee.h Main.cpp [karen@linux40 ~/C++]$ gcc -x c++ -c *.cpp *.h [karen@linux40 ~/C++]$ ls Employee.cpp Employee.h Employee.o Main.cpp Main.o [karen@linux40 ~/C++]$ gcc -lstdc++ *.o -o exe Main.o:在函数“main”中: Main.cpp:(.text+0x8d): undefined reference to `Employee::Employee()' collect2: ld 返回 1 个退出状态员工.h
#include <iostream>
#include <string>
using namespace std;
class Employee {
public:
Employee();
Employee(string theName, float thePayRate);
string getName() const;
float getPayRate() const;
float pay(float hoursWorked) const;
protected:
string name;
float payRate;
};
员工.cpp
#include "Employee.h"
Employee::Employee() {
}
Employee::Employee(string theName, float thePayRate) {
name = theName;
payRate = thePayRate;
}
string Employee::getName() const {
return name;
}
float Employee::getPayRate() const {
return payRate;
}
float Employee::pay(float hoursWorked) const {
return hoursWorked * payRate;
}
Main.cpp
#include "Employee.h"
int main() {
Employee e;
return 0;
}
【问题讨论】:
-
您不应将 .h 文件传递给 gcc。
-
“错误”是什么?此外,您的
*.h文件中有哪些必须明确提供给编译器的内容? -
是的,它确实关心链接库的顺序,即使这与您的错误不完全相关,但与您的问题有点相关
-
是的,我同意你的看法。我不需要传递“.h”文件。但是为什么当我们首先传递“.h”然后是“.cpp”文件时,gcc 感觉找到了,反之亦然?要查看错误消息,请查看我的更新数据。谢谢,凯伦
标签: c++ gcc static-linking