Avatar billede walker Nybegynder
28. august 2003 - 09:46 Der er 38 kommentarer og
1 løsning

c++ begynder; hvordan laver jeg header fil??

Hej
Jeg er begynder i c++ programmering, men ikke i programmering generelt. Jeg prøver at lære lidt c++.

Hvordan får jeg lavet min egen headerfil? Jeg laver et objekt-fil indeholdende nogle structs eller klasser. For at kunne inkludere den i mit "hoved" program skal jeg jo lave en headerfile... hvordan gør jeg det??

mvh
Walker
Avatar billede jpk Nybegynder
28. august 2003 - 09:58 #1
Giver den efternavnet 'h', altså ex MyHeader.h
Avatar billede arne_v Ekspert
28. august 2003 - 10:02 #2
En hedare-fil er bare ne ganske almindelig tekst fil som du #include'r i dine
programmer.

Typisk hedder den .h til som fil type men ingenting og .hxx er set til C++
(henholdsvis ny og gammel).

Husk at bruge:

#ifndef FOOBAR_H
#define FOOBAR_H

...

#endif

så de kan inkluders mange gange uden problemer.
Avatar billede walker Nybegynder
28. august 2003 - 10:04 #3
Øh, er det ikke noget med at i header filen skal man inkludere .o filen, samt lave prototyper til alle den's funktioner? eller er jeg helt ude i noget forkert her? *S*
og så skal jeg vel bruge #include "fil" når den ligger i samme dir, og ikke i compiler-path'en ?
Avatar billede arne_v Ekspert
28. august 2003 - 10:08 #4
#include "foobar.h"

er helt fint.

Du skal absolut ikke include .o filen (som er binær).

Du skal putte det i .h filen du har brug for. Prototyper til alle
funktioner er en typisk ting at bruge den til.
Avatar billede walker Nybegynder
28. august 2003 - 10:17 #5
Ok, jeg har prøvet med følgende:
[inc.cpp]
#include <stdio.h>
void test() {
        printf("included");
}

[inc.h]
void test(void);

[test.cpp]
#include "inc.h";
int main() {
        test();
}

har compilet:
gcc -c inc.cpp
gcc test.cpp -o test

men får fejl ved compileringen af test.cpp..?
Avatar billede walker Nybegynder
28. august 2003 - 10:18 #6
!NB glemte jeg at nævne at det var på linux? *S*
Avatar billede arne_v Ekspert
28. august 2003 - 10:37 #7
Prøv med:

gcc -c inc.cpp -o inc.o
gcc -c test.cpp -o test.o
gcc test.o inc.o -o test
Avatar billede arne_v Ekspert
28. august 2003 - 10:38 #8
Kommer ikke sagen ved, men normalt bruger man .c og gcc (C) eller
.cpp og g++ (C++).
Avatar billede jpk Nybegynder
28. august 2003 - 10:46 #9
Ex:

Test.h

class Test
{
  public:
    void testFunc();
};


Test.cpp

#include <stdio.h>
void Test::testFunc()
{
  printf("included");
}

TestOfClass.cpp

#include "test.h"

int main()
{
  Test testObj;
  testObj.testFunc();
}
Avatar billede walker Nybegynder
28. august 2003 - 10:51 #10
Hvis jeg gøre som du skriver (arne_v) får jeg en fejl ved sidste kommando:

># gcc test.o inc.o -o test
test.o(.eh_frame+0x11): undefined reference to `__gxx_personality_v0'
collect2: ld returned 1 exit status

...men kan det ikke lade sig gøre at inkludere uden at compile dem sammen?
Avatar billede arne_v Ekspert
28. august 2003 - 10:53 #11
Brug g++ i.s.f. gcc !
Avatar billede arne_v Ekspert
28. august 2003 - 10:54 #12
g++ -c inc.cpp -o inc.o
g++ -c test.cpp -o test.o
g++ test.o inc.o -o test
Avatar billede walker Nybegynder
28. august 2003 - 10:57 #13
ok, arne_v, det fungerer med g++, men så bliver de jo compilet sammen til én binær fil... kan det ikke lade sig gøre at lave dem som .o + .h filer, og på den måde inkludere den?
Avatar billede arne_v Ekspert
28. august 2003 - 11:15 #14
Jeg forstå ikke hvad du vil.

.c/.cpp/.h er source (input)
den eksekverbare fil er output
.o er bare midlertidige filer

Du kan stoppe alle dine .o filer ned i en .a fil bruge den fra
dine programmer.
Avatar billede walker Nybegynder
28. august 2003 - 11:21 #15
Øh, det jeg gerne vil er at have mit program i nogle filer med tilhørende headerfiler, som jeg kan include i mit "main" program. Jeg troede at en headerfil havde en tilhørende objekt-fil, men det er måske ikke objektfiler som implementerer headerfilen's beskivelse?
Avatar billede walker Nybegynder
28. august 2003 - 11:22 #16
for jeg kan ikke compile f.eks g++ inc.cpp -o inc medmindre der er en main metode i filen...
Avatar billede arne_v Ekspert
28. august 2003 - 11:25 #17
Det er vel egentligt .c/.cpp der implementerer .h filens funktionalitet.

Men da en .o bare er en oversat version af .c/.cpp så kan den jo også siges
at være det.

Hvis det er et lille projekt du laver, så build fra scratch.

Hvis det er et stort projekt så put dine .o i en .a, så du har
et antal .h og en enkelt .a !
Avatar billede arne_v Ekspert
28. august 2003 - 11:26 #18
g++ -c inc.cpp -o inc.o

virker udmærket og det er det man bruger.
Avatar billede walker Nybegynder
28. august 2003 - 11:36 #19
ok, det er nok mig som er lidt langsom her, men det jeg gerne vil, er at lave en headerfil som jeg kan inkludere i min program. Header filer implementerer jo intet, men virker (så vidt jeg ved) mere som et interface til en binær fil. Hvordan laver og compiler jeg den binære fil, og tilhørende headerfil?
Avatar billede arne_v Ekspert
28. august 2003 - 11:44 #20
g++ -c inc.cpp -o inc.o

oversætter implementationen af test fra source til binær form

g++ -c test.cpp -o test.o

oversætter hoved test program fra source til binær form (bruger
definitionen i inc.h)

g++ test.o inc.o -o test

linker de 2 binære .o filer sammen til en enkelt executable
Avatar billede walker Nybegynder
28. august 2003 - 11:50 #21
Hmm, okay... men det er det som jeg helst ikke vil ha... at den compiler dem sammen til en enkelt binær fil... altså jeg mener, jeg skal jo heller ikke compile stdio.o filen med når jeg bruger #include <stdio.h>...

Jeg er ikke klar over hvilken binær fil som indeholder funktionerne i stdio om det er en objektfil(.o), executabel(.a) eller sharedobjekt(.so) fil, men det er det jeg gerne vil opnå... at kunne include nogle funktioner fra en anden fil, uden at skulle compile dem sammen til én binær fil...

jeg vil altså gerne ha 3 filer:
includable.(xx?)
includable.h
mainprog(.a)
Avatar billede walker Nybegynder
28. august 2003 - 11:51 #22
includable skal så indeholde et antal funktioner og/eller klasser. Jeg kommer fra java-programmering, som jo kører helt konsekvent med denne opdeling i .class filer, hvor der ikke er headerfiler...
Avatar billede arne_v Ekspert
28. august 2003 - 12:07 #23
Nu er jeg ikke den helt store ekspert i Linux libraries, men jeg vil
tro at stdio implementationen ligger i:
  /usr/lib/libc.a
Avatar billede arne_v Ekspert
28. august 2003 - 12:18 #24
I Java er definitioner og implementationer samlet (medmindre man
konsekvent laver interfaces til alle sine klasser).

Og der er kun et trin fra source til ekseikverbar.

Men C/C++ er altså anderledes.
Avatar billede walker Nybegynder
28. august 2003 - 12:19 #25
Hm, okay... det må jo være muligt at lave sine filer som nogle "includable" filer, det kan jo ikke passe at alle programmer er lavet i en kæmpe executable fil...
Hvad er det jeg skal compile min includable om til? .a? det må jeg ikke når den ikke indeholder en main metode...

Når jeg så får compilet min includable om til whatever, hvad skriver jeg så i min header fil?
Avatar billede arne_v Ekspert
28. august 2003 - 12:21 #26
Linux eller gcc folkene har en stdio.c som de har compilet til
stdio.o og gemt i libc.a (der er sikkert flere kilde tekst filer men
lad os holde det simpelt).

Du kan ikke køre libc.a men du kan linke kodenmed ind i en eksekverbar
fil.

Hvad du også gør.

g++ test.o inc.o -o test

henter kode fra en række .a filer (de er bare ikke angiver på kommando-linien).
Avatar billede arne_v Ekspert
28. august 2003 - 12:24 #27
Hvis du compiler m1.cpp, m2.cpp og m3.cpp til m1.o, m2.o og m3.o
og gemmer dem i m.a og har erklæringerne i m.h, så kan du lave et program
der har:

#include "m.h"

og som derfor kan og bruge funktionerne deri og compiles .

Når så du linker angiver du bare at m.a skal linkes med.

g++ -c test.cpp -o test.o
g++ test.o m.a -o test

eller:

g++ test.cpp m.a -o test
Avatar billede walker Nybegynder
28. august 2003 - 12:37 #28
Ja, men jeg vil IKKE ha dem i én fil, de skal ligge som to filer + en header fil... jeg skriver jo heller ikke: g++ test.o stdio.o -o test, altså jeg vil compiler jo (så vidt jeg ved?) ikke alle libraries med i mit lille program?
Når jeg downloader et program/applikation så er der jo også mere en én fil med... f.eks apache ligger jo ikke i kun én fil... den er jo opbygget i en masse libraries, som den "henter/bruger" funktioner fra...
I windows bruges dll-filer... når man skriver programmer i f.eks VB, så compiler man jo heller ikke hele dll-filen med i sit program.

forestil jer at jeg vil lave min egne libraries, f.eks min egen stdio library...
Avatar billede arne_v Ekspert
28. august 2003 - 12:41 #29
Så er det præcis som jeg beskriver.

Du har m.h og m.a - du inkluder m.h og linker med m.a !

libc.a er bare speciel derved at det ikke skal angives i kommando-linien.

Det er ligesom i java hvor du heller ikke angiver rt.jar - den ved
javac og java godt hvor ligger.
Avatar billede arne_v Ekspert
28. august 2003 - 12:43 #30
Alternativt kan du naturligvis undlade at putte m1.o, m2.o og m3.o
ind i m.a og så have alle de filer sammen med m.h og linke med:

g++ test.o m1.o m2.o m3.o -o test

men det bliver hurtig en meget lang kommando.

C/C++ og Java er simpelthen forskellige.
Avatar billede arne_v Ekspert
28. august 2003 - 12:45 #31
Har du iøvrigt kigget lidt på make ?

(det kan automatisere en del af build arbejdet)
Avatar billede walker Nybegynder
28. august 2003 - 12:53 #32
ok, men når jeg linker dem på den måde, så ligger hele den binære kode i én fil... jeg kan slætte alle andre filer end test(.a) filen, og stadig køre programmet, det gir jo ikke mening så? for programmer har jo ikke hver deres kopi af alle dll/obj filer?

jeg har kun lige skimmet på make kommandoen, og det er vist noget med at den kun compiler "nye" elementer, eller sådan noget...
Avatar billede arne_v Ekspert
28. august 2003 - 12:57 #33
Hvis du vil genbruge den samme binære kode i flere programmer, så skal
du bruge .so filer.

Det er en klump binær kode som kan bruges fra flere eksekverbare programmer.
Avatar billede arne_v Ekspert
28. august 2003 - 12:59 #34
Hvis laver en makefile der fortæller at:
  test afhænger af test.o og inc.o
  test.o afhænger af test.cpp og inc.h
  inc.o afhænger af inc.cpp
så kan make selv generere de nødvendige build kommandoer afhængig
af hvad der er eændret siden sidste build.
Avatar billede walker Nybegynder
28. august 2003 - 13:02 #35
arne_v << okay, det er nok den jeg har ledt efter... men hvordan compiler jeg dem til shared objects, og skal headerfilen bare være magen til object filernes?
Avatar billede arne_v Ekspert
28. august 2003 - 13:08 #36
Header filen er præcis den samme uanset hvad du bruger af .o/.a/.so !
Avatar billede walker Nybegynder
28. august 2003 - 13:09 #37
ok, men hvordan laver jeg .so filen?
Avatar billede walker Nybegynder
28. august 2003 - 13:09 #38
ej, lukker og starter et nyt spsm, det er troede jeg var et simpelt spsm...
Avatar billede arne_v Ekspert
28. august 2003 - 13:14 #39
Du laver selve .so filen med -shared.

Så vidt jeg ved skal du enten have et .a med stub kode eller
bruge dlopen/dlsym/dlclose til at loade den med.

Det er ikke særligt almindeligt at bruge .so til apps.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester