Страница 1 из 1

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

Добавлено: 28 апр 2006, 12:54
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, но как?

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

Добавлено: 28 апр 2006, 14:09
Yurand
say.h

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

#ifdef __cplusplus
extern "C" {
#endif

int say(); 

#ifdef __cplusplus
}
#endif


Добавлено: 28 апр 2006, 15:14
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