开发者

Compile C++ in linux

I'm trying to compile a simple application in linux. My main.cpp looks something like

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

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

Where Database.h is my header and has a corresponding Database.cpp. I get the following error when compiling:

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<ch开发者_JS百科ar, 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

Searches for something like this are all over the place as you can imagine. Any suggestions on what I might be able to do to fix the problem?


Those are linker errors. It is complaining because it is trying to produce the final executable, but it cannot, because it has no object code for Database functions (the compiler does not infer that the function definitions corresponding to Database.h live in Database.cpp).

Try this:

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

Alternatively:

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


You refer to code from Database.h so you have to provide an implementation, either in a library or via an object file Database.o (or a source file Database.cpp).


You need to compile Database.cpp as well, and link the two together.

This:

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

tries to compile main.cpp to a complete executable. Since the code in Database.cpp is never touched, you get linker errors (you call out into code that is never defined)

And this:

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

compiles both files into an executable

The final option:

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

First compiles the two files to separate object fiels (.o), and then links them together into a single executable.

You may want to read up on how the compilation process in C++ works.


Instead of

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

try something like

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

This should fix missing references in the linking process.


You're trying to compile main.cpp without the Database source files. Include the Database object file in the g++ command and these functions will be resolved.

I can pretty much guarantee to you that this will become a pain fast. I recommend using make to manage compilation.

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜