[C++] Linking object files to executable

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • cyberstalker
  • Registratie: September 2005
  • Niet online

cyberstalker

Eersteklas beunhaas

Topicstarter
Ik probeer om verschillende losse bestanden te compileren als object files en deze vervolgens te linken (omdat ik graag naar een Makefile toe wil).

Het maken van object files gaat goed, maar als ik wil gaan linken gaat het mis. Ik heb een drietal testbestanden gemaakt om te kijken of daar het probleem ook in optreedt en er gebeurt hetzelfde.

object.h
C++:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#ifndef OBJECT_H
#define OBJECT_H 1

namespace test
{
    class test
    {
        private:
            int blatest;
        public:
            test();
            ~test();
    };
}

#endif /* OBJECT_H */


object.c
C++:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include <iostream>
#include "object.h"

namespace test
{
    inline test::test()
    {
        std::cout << "Constructing test" << std::endl;
    }

    inline test::~test()
    {
        std::cout << "Destructing test" << std::endl;
    }
}


test.cc
C++:
1
2
3
4
5
6
7
#include "object.h"

int main()
{
    test::test testobj;
    return 0;
}


Vervolgens creëer ik object files van test.cc en object.cc. Wanneer ik deze bestanden vervolgens probeer te linken krijg ik 'undefined reference errors'
$ g++ -c object.cc
$ g++ -c test.cc
$ g++ -o test test.o object.o
test.o: In function `main':
test.cc:(.text+0x11): undefined reference to `test::test::test()'
test.cc:(.text+0x22): undefined reference to `test::test::~test()'
collect2: ld returned 1 exit status
In de voorbeelden die ik kan vinden op diverse sites, wordt het allemaal op deze manier gedaan, maar ik krijg het niet voor elkaar. Waarom ziet de compiler de referentie naar test::test::test() niet? Deze staat gewoon in test.o

Ik ontken het bestaan van IE.


Acties:
  • 0 Henk 'm!

  • RobertMe
  • Registratie: Maart 2009
  • Nu online
cyberstalker schreef op vrijdag 28 januari 2011 @ 18:31:
Waarom ziet de compiler de referentie naar test::test::test() niet? Deze staat gewoon in test.o
Staat deze niet in object.o (en je main() in test.o). En dan een gokje, draaie het eens om: gcc -o test object.o test.o Ik kan mij indenken dat GCC ze verwerkt in de volgorde zoals je ze opgeeft, dus als hij test.o leest/verwerkt kent hij object.o en dus test::test::test() nog niet

Acties:
  • 0 Henk 'm!

  • farlane
  • Registratie: Maart 2000
  • Laatst online: 15:26
Hij kent die constructor niet omdat je 'em inline hebt gemaakt in een source file. De definitie zal dan ook alleen gebruikt kunnen worden in de source file waarin ie gedefinieerd wordt.

Haal die misplaatste 'inline' weg en het zal werken.

Somniferous whisperings of scarlet fields. Sleep calling me and in my dreams i wander. My reality is abandoned (I traverse afar). Not a care if I never everwake.


Acties:
  • 0 Henk 'm!

  • cyberstalker
  • Registratie: September 2005
  • Niet online

cyberstalker

Eersteklas beunhaas

Topicstarter
De inline was inderdaad het probleem.

Ik ontken het bestaan van IE.


Acties:
  • 0 Henk 'm!

  • farlane
  • Registratie: Maart 2000
  • Laatst online: 15:26
cyberstalker schreef op vrijdag 28 januari 2011 @ 20:51:
De inline was inderdaad het probleem.
Snap je ook waarom? :)

Somniferous whisperings of scarlet fields. Sleep calling me and in my dreams i wander. My reality is abandoned (I traverse afar). Not a care if I never everwake.