Łączenie C i C++

0

Trochę n00bskie pytanie, ale przejdźmy do rzeczy.

Jest sobie optymalizator, tzn program optymalizujący za pomocą algorytmów genetycznych parametry na podstawie funkcji kosztu. Jest tutaj: http://encode.ru/threads/1679-Question-about-LPAQ1-mixer?p=32460&viewfull=1#post32460 i jest napisany w C++

Ja napisałem sobie program w czystym C, np tutaj: http://encode.ru/threads/1671-Demixer-new-tree-based-bitwise-CM-codec-is-in-development?p=32455&viewfull=1#post32455

Chcę go zintegrować. Autor optymalizatora napisał o "compile in", ale przy zwykłym zaincludeowaniu moich plików z kodem C do kodu C++ (tzn do funkcji rastrigin.cpp) jest trochę rzygania errorami. Zresztą nie chcę żeby np pliki nagłówkowe czy coś innego się gryzło.

Myślę o tym, by połączyć pliki OBJ (czy jak im tam). Z drugiej strony nie chcę robić z mojego programu biblioteki, chcę tylko wyeksportować jedną funkcję.

Pytanie: jak wyeksportować funkcję oraz co zaimportować do Code::Blocks i w którym miejscu, tak żeby:

  1. najlepiej nie musieć nic kompilować z konsoli,
  2. nie zmieniać typu mojego programu na bibliotekę (bo nie robię biblioteki, a samodzielny program),

Dodam, że ja piszę ten program w C pod NetBeansem.

1

No ok. Czyli kiedy po prostu włączasz swój kod w C do projektu to nie kompiluje się, bo jest dużo błędów? To trochę dziwne, "normalny" kod w C zazwyczaj skompiluje się normalnie kompilatorem C++. (Chociaż może jest tak tylko dla niewielkich projektów) Strasznie tego dużo? Może prościej je rozwiązać zamiast kombinować bardziej?

Chyba możesz zrobić sobie nagłówek (albo po prostu gdzieś to wpisać) z deklaracją tej jednej funkcji o której piszesz z extern "C". Następnie skompilować swoje rzeczy kompilatorem C, te inne rzeczy kompilatorem C++ a potem linkować to w całość. Chyba powinno działać?

Mam na myśli to:

header.h:

#ifndef HEADER_H
#define HEADER_H

#ifdef __cplusplus
extern "C" {
#endif

int return_two();
  
#ifdef __cplusplus
}
#endif

#endif

function.c:

#include "header.h"

int return_two() {
  return 2;  
}

main.cpp:

#include <iostream>

#include "header.h"

int main() {
  std::cout << return_two() << '\n';
  return 0;  
}

I potem:

gcc -c -Wall -Wextra function.c
g++ -c -Wall -Wextra main.cpp
g++ function.o main.o -o test

Ważne jest, żeby main był z C++ i żeby linkowanie było kontrolowane przez kompilator C++.

1

Ok, z palca działa. Nawet udało mi się to podpiąć pod Code::Blocksa, heh :] Gitez majonez, nie trzeba includować C z C++ na szczęście.

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