Я пытаюсь скомпилировать очень простой код на 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: In function `main':
Main.cpp:(.text+0x8d): undefined reference to `Employee::Employee()'
collect2: ld returned 1 exit status
Employee.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;
};
Employee.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;
}