Скомпилируйте C ++ в Linux - PullRequest
       2

Скомпилируйте C ++ в Linux

0 голосов
/ 21 апреля 2011

Я пытаюсь скомпилировать простое приложение в Linux. Мой main.cpp выглядит примерно так:

#include <string>
#include <iostream>
#include "Database.h"

using namespace std;
int main()
{
    Database * db = new Database();
    commandLineInterface(*db);
    return 0;
}

Где Database.h - мой заголовок и имеет соответствующий Database.cpp. Я получаю следующую ошибку при компиляции:

me@ubuntu:~/code$ g++ -std=c++0x main.cpp -o test
/tmp/ccf1PF28.o: In function `commandLineInterface(Database&)':
main.cpp:(.text+0x187): undefined reference to `Database::transducer(std::basic_string<char, std::char_traits<char>, std::allocator<char> >)'
main.cpp:(.text+0x492): undefined reference to `Database::transducer(std::basic_string<char, std::char_traits<char>, std::allocator<char> >)'
main.cpp:(.text+0x50c): undefined reference to `Database::transducer(std::basic_string<char, std::char_traits<char>, std::allocator<char> >)'
/tmp/ccf1PF28.o: In function `main':
main.cpp:(.text+0x721): undefined reference to `Database::Database()'
collect2: ld returned 1 exit status

Поиски чего-то подобного повсюду, как вы можете себе представить. Любые предложения о том, что я мог бы сделать, чтобы решить проблему?

Ответы [ 5 ]

5 голосов
/ 21 апреля 2011

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

Попробуйте:

g++ -std=c++0x main.cpp Database.cpp -o test

В качестве альтернативы:

g++ -std=c++0x main.cpp -c -o main.o
g++ -std=c++0x Database.cpp -c -o Database.o
g++ Database.o main.o -o test
2 голосов
/ 21 апреля 2011

Вы ссылаетесь на код из Database.h, поэтому вам необходимо предоставить реализацию, либо в библиотеке, либо через объектный файл Database.o (или исходный файл Database.cpp).

1 голос
/ 21 апреля 2011

Вам также необходимо скомпилировать Database.cpp и связать их вместе.

This:

g++ -std=c++0x main.cpp -o test

пытается скомпилировать main.cpp до полного исполняемого файла.Поскольку код в Database.cpp никогда не затрагивается, вы получаете ошибки компоновщика (вы вызываете код, который никогда не определяется)

И это:

g++ -std=c++0x main.cpp Database.cpp -o test

компилирует оба файла в исполняемый файл

Последний вариант:

g++ -std=c++0x main.cpp Database.cpp -c
g++ main.o Database.o -o test

Сначала компилируются два файла в отдельные области объектов (.o), а затем связываются между собой в один исполняемый файл.

YouВозможно, вы захотите прочитать о том, как работает процесс компиляции в C ++.

0 голосов
/ 21 апреля 2011

Вы пытаетесь скомпилировать main.cpp без исходных файлов базы данных.Включите объектный файл базы данных в команду g ++, и эти функции будут решены.

Я могу в значительной степени гарантировать вам, что это быстро станет болью.Я рекомендую использовать make для управления компиляцией.

0 голосов
/ 21 апреля 2011

вместо

g++ -std=c++0x main.cpp -o test

попробуйте что-то вроде

g++ -std=c++0x main.cpp Database.cpp -o test

Это должно исправить недостающие ссылки в процессе связывания.

...