C ++ простая компиляция файлов с использованием компилятора "gcc" - PullRequest
0 голосов
/ 21 марта 2012

Я пытаюсь скомпилировать очень простой код на 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;
}

Ответы [ 2 ]

1 голос
/ 21 марта 2012

Я предполагаю, что спрашивающий использует заголовки в нестандартном расположении, следовательно, передает их явно компилятору.Если для работы кода в * .c требуется * .h, то передача заголовков после кода приведет к ошибке, если обратный порядок не работает.

Если вы включаете заголовки с

#include <file.h>

компилятор не найдет их в текущем каталоге (если вы не сохраните свой код в / usr / include ...), поэтому используйте вместо него заголовки, расположенные в заголовке,

#include "file.h"

тот же каталог, что и код.Если они где-то еще, добавьте

-I /path/to/headers/

к команде gcc.

Удачи!

0 голосов
/ 21 марта 2012

Как правило, вы не должны передавать файл .h напрямую компилятору.Это не имеет никакого смысла и не правильно.

Но похоже, что вопрос здесь в основном для понимания того, как работает gcc.Итак, мой ответ с этой точки зрения.

Я предполагаю, что вы включаете тот же файл .h в файл .cpp.

Что происходит, когда вы сначала передаете файл .cpp, а затем .h, компилятор видитдекларация, затем определение, а затем снова декларация.Это вызывает ошибку компоновщика, поскольку для второго объявления нет соответствующего определения.

В отличие от этого, если сначала передать .h, а затем .cpp, он увидит два объявления, а затем определение, которое прекрасно связывается.

...