Использование c в проектах на c++ и наоборот

Все о программировании под *nix
Аватара пользователя
Silos
Неотъемлемая часть форума
Сообщения: 287
Зарегистрирован: 15 фев 2004, 19:04
Откуда: Belarus, Minsk
Контактная информация:

Использование c в проектах на c++ и наоборот

Сообщение Silos »

Есть ли возможность разные части прграммы писать на с и с++?
Мои попытки не чем хорошим не закончились.
Исходники:

main.c

Код: Выделить всё

#include "say.h"

int main()
{
        say();
        return 0;
}



say.cpp

Код: Выделить всё

#include <iostream>
using namespace std;

int say()
{
        cout << "Hello\n";
        return 0;
}



say.h

Код: Выделить всё

int say();


Компилирование и линковка:

Код: Выделить всё

[silos@asakura 1]$ gcc -c main.c -o main.o
[silos@asakura 1]$ g++ -c say.cpp -o say.o
[silos@asakura 1]$ gcc -o say say.o main.o
say.o: In function `__static_initialization_and_destruction_0(int, int)':say.cpp:(.text+0x23): undefined reference to `std::ios_base::Init::Init()'
say.o: In function `__tcf_0':say.cpp:(.text+0x6c): undefined reference to `std::ios_base::Init::~Init()'
say.o: In function `say()':say.cpp:(.text+0x83): undefined reference to `std::cout'
:say.cpp:(.text+0x88): undefined reference to `std::basic_ostream<char, std::char_traits<char> >& std::operator<< <std::char_traits<char> >(std::basic_ostream<char, std::char_traits<char> >&, char const*)'
say.o:(.eh_frame+0x11): undefined reference to `__gxx_personality_v0'
main.o: In function `main':main.c:(.text+0x12): undefined reference to `say'
collect2: ld returned 1 exit status
[silos@asakura 1]$ g++ -o say say.o main.o
main.o: In function `main':main.c:(.text+0x12): undefined reference to `say'
collect2: ld returned 1 exit status
[silos@asakura 1]$


Собрать объектные файлы неудалось, ни gcc, ни g++.
Я так думаю, что компилятору необходимо указать каким образом линковать, что бы не было undefined reference, но как?

Foxx
Неотъемлемая часть форума
Сообщения: 435
Зарегистрирован: 03 апр 2004, 17:05
Контактная информация:

Сообщение Foxx »

g++ say.cpp main.c -o main не собирает приложение? не верю...
а вообще надо просто линковать полученные обжекты с -lstdc++ насколько я помню (в случае использования ld или gcc на фазе линковки).

Yurand
Интересующийся
Сообщения: 40
Зарегистрирован: 21 апр 2006, 15:22
Откуда: Мінск
Контактная информация:

Сообщение Yurand »

say.h

Код: Выделить всё

#ifdef __cplusplus
extern "C" {
#endif

int say();

#ifdef __cplusplus
}
#endif


Аватара пользователя
Silos
Неотъемлемая часть форума
Сообщения: 287
Зарегистрирован: 15 фев 2004, 19:04
Откуда: Belarus, Minsk
Контактная информация:

Сообщение Silos »

Подправил до следующего вида - заработало, спасибо. Makefile все собираю.
А где можно по этой теме, желательно на русском, почитать, чтоб разобраться как следут?

say.h

Код: Выделить всё

#ifdef __cplusplus
extern "C" {
#endif

int say();

#ifdef __cplusplus
}
#endif


say.cpp

Код: Выделить всё

#include <iostream>
#include "say.h"
using namespace std;

int say()
{
        cout << "Hello\n";
        return 0;
}



Makefile

Код: Выделить всё

say: main.o say.o
        g++ -o say say.o main.o

main.o: main.c say.h
        gcc -c main.c

say.o: say.cpp say.h
        g++ -c say.cpp

Ответить