Включение кода C в C++

Я пытаюсь включить код C в простую программу на C++, но столкнулся с неожиданной проблемой - когда я пытаюсь скомпилировать программу, g++ выдает следующую ошибку:

/tmp/cccYLHsB.o: In function `main':
test1.cpp:(.text+0x11): undefined reference to `add'

Я искал решение и нашел этот учебник:

http://www.parashift.com/c++-faq/overview-mixing-langs.html

Кажется, в моей программе нет никакой разницы, поэтому я немного потерялся...

Моя программа на С++ выглядит так:

test1.ccp

#include <iostream>
using namespace std;

extern "C" {
#include "sample1.h"
}

int main(void)
{
    int x= add(3);

    cout << "the current value of x is " << x << endl;

    return 0;
}

Заголовок и функция sample1 выглядят следующим образом:

образец1.ч

#include <stdio.h>

double add(const double a);

образец1.с

#include "sample1.h"

double add(const double a)
{
    printf("Hello World\n");

        return a + a;
}

Для компиляции я сначала компилирую test1.o с g++ и sample1.o с gcc (также пробовал g++, но без разницы)

g++ -c test1.cpp

gcc -c sample1.c

Это работает, как и ожидалось. После этого я пытаюсь связать программу следующим образом:

g++ sample1.o test1.o -o test

Вот где я получаю ошибку, упомянутую выше

test1.cpp:(.text+0x11): undefined reference to `add' 

У меня такое чувство, что я упускаю что-то важное, но просто не вижу этого.

Любая помощь высоко ценится!

С уважением

Жюль


person jules    schedule 20.11.2012    source источник
comment
g++ действительно искажает имена, из-за чего я думаю, что добавление не разрешено   -  person Omkant    schedule 20.11.2012
comment
Вы когда-нибудь компилировали sample1.h?   -  person Jacob    schedule 20.11.2012
comment
Это должно работать, насколько я вижу. Что выводит команда nm sample1.o?   -  person aschepler    schedule 20.11.2012
comment
Работает здесь, как опубликовано (gcc 4.6.2). Какую версию ты используешь?   -  person Daniel Fischer    schedule 20.11.2012
comment
С точным исходным кодом и командной строкой для компиляции и линковки я не могу это воспроизвести — работает как положено. Вы делаете именно то, что написали здесь?   -  person nos    schedule 20.11.2012
comment
@JacobAbrahams, как часто вы компилируете заголовочный файл? Большинство людей склонны только #include их, как показывает ОП, он это сделал.   -  person mah    schedule 20.11.2012
comment
@pmg у него уже есть это вокруг #include; одного уровня достаточно, нет?   -  person mah    schedule 20.11.2012


Ответы (2)


Он работает так, как ожидалось. Убедитесь, что вы случайно не скомпилировали sample1.c с g++.

person chill    schedule 20.11.2012
comment
И есть простой способ выяснить это, запустив nm sample1.o, должен быть 1 неискаженный символ для add , если его нет, то что-то другое, чем gcc -c sample1.c, сгенерировало файл sample1.o. - person nos; 20.11.2012
comment
Большое спасибо, это была проблема! Я скомпилировал оба файла с помощью g++ - person jules; 20.11.2012

Это работает на моей машине. Попробуйте GCC 4.7.0

person Bernd Elkemann    schedule 20.11.2012