Linkowanie dwóch plików w dev-c++

0

W rodziale 9.5 Grębosza jest mowa o linkowaniu plików.
PLIK A

#include<iostream.h>
int func(int a, int b){
    return a + b;
}

PLIK B

#include<iostream.h>
extern int func(int, int);

int main(){
     cout<<func(2, 2);
     getchar();
}

Nie wiem jak to zlinkować, do jakeigo formatu zapisać powyższe pliki, etc.
Dodam, że korzystam z Dev-C++

0

Sprawa pierwsza - korzystasz ze starej symfonii (w standardzie przy dołączaniu biblioteki iostream nie podajemy już rozszerzenia .h), kup sobie symfonię C++ STANDARD.
Sprawa druga - zwykle linkowaniem przejmować się nie musisz, bo robi to za Ciebie kompilator (automatycznie wymusza działanie linkera).
Sprawa trzecia - oba pliki zapisujesz z rozszerzeniem .cpp

0

Sprawa czwarta - zmień Dev-C++ na np. CodeBlocks.

0

Zapisałem oba pliki do .cpp w tym samym folderze, i jak mam to teraz skompilować w całość, żeby uzyskać exeka?

1

W przypadku IDE jak Dev (...) musisz stworzyć projekt i te pliki dodać do tegoż projektu. Gdybyś kompilowal to ręcznie z konsoli to musiałbyś zrobić coś w stylu

g++ -ansi -pedantic -Wall -Wextra plik1.cpp plik2.cpp -o wynik.exe
0

Dzięki @Shalom pomogło. Mam jeszcze zapytanie.
Napisałem w C funkcje:

#include <stdio.h>
void func2 () {
   printf ("Udalo Ci się odpalic program.");
} 

i w PLIK 2 dodałem:

#include<iostream>
using namespace std;
extern int func(int, int);
extern "C" void func2();
int main(){
     cout<<func(2, 2);
     func2();
     getchar();
}

Dlaczego pojawił się error podczas kompilacji?

[Linker error] undefined reference to `func2'

0

A ten plik niby w C kompilowałeś jako C czy jako C++?

0

Całość jak widać po kodzie kompilowałem w C++. Zrobiłem tak jak Grębosz przedstawił to w rozdziale 9.4

0

aha jeżeli chodzi o pytanie @Shalom to zapisałem do .c, natomiast pozstałe pliki są w .cpp

0
/* plik1.c */
#include <stdio.h>
void func2 (void) {
   printf ("Udało Ci się odpalić program.");
} 
// plik2.cpp
int func(int a, int b) {
    return a + b;
}
// plik3.cpp
#include<iostream>
using namespace std;
extern int func(int, int);
extern "C" void func2();
int main(){
     cout<<func(2, 2);
     func2();
     getchar();
}

wszystkie trzy pliki muszą trafić do kompilacji i linkera.

0

No cóż stworzyłem nowy projekt i dodałem do niego plik1.c, plik2.cpp, plik3.cpp
Po całkowitej przebudowie (REBULID) wywala mi [Linker error] undefined reference to func2'`
Natomiast extern "C" void func2(); zmienie na extern void func2(); projekt kompiluje się bez problemu. O co kaman?

0

Poczytaj o dekorowaniu nazw w C i C++.

0

Kod jest dobry, tylko źle kompilujesz:

#!/bin/sh

gcc -c plik1.c -o plik1.o
g++ -c plik2.cpp -o plik2.o
g++ -c plik3.cpp -o plik3.o
g++ plik1.o plik2.o plik3.o -o program
0

@pyt. bo widzisz jak zrobiłeś projekt C++ do którego dodałeś te wszystkie pliki to on to skompilował jako C++ więc ten jeden plik *.c też skompilował jako C++.
Jak tam dasz samo

extern void func2();

To powinno zadziałać.
Chodzi tutaj o to że nazwy są zmieniane przez kompilator, ale inaczej dla C i inaczej dla C++ dlatego jak skompilowałeś wszystko jako C++ to kompilator nie widzi ta tej funkcji z C.

Żeby sie tak bawić jak sie bawisz to musisz mieć jakieś porządne środowisko a nie Deva...

0

Zainstalowałem CodeBlocks :)
Czyli analogicznie mam stworzyć projekt dodać do niego plik2.cpp i plik3.cpp, a gdzie umieścić plik1.c żeby skompilował się jak C, a nie jako C++ tak jak wspomniałeś @Shalom ?

0

prawdopodobnie gdzieś ustawić, by rodzaj kompilacji zależał od rozszerzenia pliku (a nie na sztywno C++). nie znam C::B, w Visualu jest taka opcja.

0

Mam też VC++ i stworzyłem projekt w c++ i dodałem do niego plik1.c, plik2.cpp, plik3.cpp
Teraz pytanie jak zrobić żeby to odróżniał?

0

w Visualu 2008
Project | Properties | C/C++ | Advanced | Compile As, Default

w Visualu 2010 ta opcja powinna już być tak domyślnie ustawiona i nic nie trzeba robić. ale sprawdź.

0

Faktycznie we Visualu 2010 linkowanie jest ustawione domyślnie, tak samo jeśli chodzi C::B 10.05
Dzięki serdeczne za pomoc :)

0

Tak z ciekawości zapytam jak wyglądało by linkowanie w VC++ funkcji napisanej w javie np.

//Plik4.java
int func3()
{
  return 3;
}
0

to się robi tak:

piszę się plik main.c - czyli funkcja główna

no i przykładowo dodaje się plik

  • operacje.h i operacje.c**

plik operacje.h

 
#ifndef funckje_01
#define funckje_01
#include "dataStruc.h"
//**deklaracje** zapowiadające istnienie funkcji - ale nie wiemy gdzie one tak naprawdę są 
extern void readBlaBla( char * fsdfsdfsde, char * cfdgdfgb[] );
extern void Disp(Point3D  * tab, int dgdgd);
#endif

w pliku operacje.c umieszczamy definicję funkcji z pliku operacje.h - bez słowa extern

Plik operacje.c

 
#include "operacje.h"

void readBlaBla( char * fsdfsdfsde, char * cfdgdfgb[] )
{

}
void Disp(Point3D  * tab, int dgdgd)
{

}

To samo można zrobić ze zmiennymi ale trzeba umieścić słowo ekstern przy deklaracji.

a w DEV C++ można to zrobić automatycznie za pomocą kreatora - należy przejść do zakładki classes( prawy click myszy ) i new class.

Artykuł na ten temat:
http://www.devx.com/tips/Tip/12527

1 użytkowników online, w tym zalogowanych: 0, gości: 1