2016-03-27 2 views
2

Я пытался вызвать C++ из C. Я не уверен в порядке связывания. Возможно, это вызвало ошибку. По некоторым причинам компилятор жалуется undefined reference to helloWorld.`undefined reference 'при попытке интерфейса C для вызова C++

Может ли кто-нибудь посоветовать?

main.c:

#include "example.h" 
#include <stdio.h> 
int main(){ 
    helloWorld(); 
    return 0; 
} 

example.h:

#ifndef HEADER_FILE 
#define HEADER_FILE 
#ifdef __cplusplus 
    extern "C" { 
#endif 
     void helloWorld(); 
#ifdef __cplusplus 
    } 
#endif 
#endif 

example.cpp:

#include "example.h" 
#include <iostream> 
void helloWorld(){ 
    std::cout << "Hello World from CPP"; 
} 
+0

Возможный дубликат [Что такое неопределенная ссылка/неразрешенная ошибка внешнего символа и как ее исправить?] (Http: //переполнение стека.com/questions/12573816/what-is-un-undefined-reference-unresolved-external-symbol-error-and-how-do-i-fix) –

+0

Это должно работать, и я могу только предположить, что вы не подключаетесь 'example.cpp' (' example.o'). – trojanfoe

ответ

1

Есть два способа сделать это. В то время как оба работают, один является «более чистым», чем другой. Боковое примечание: Как указано в троянфи, вы можете оставить команду .o в команде компиляции/ссылки.

Вот два этапа:

cc -c main.c 
c++ -o mypgm example.cpp main.o 

Это немного некрасиво, потому что обычно конвенции является то, что источник, который компилируется является один с main

Вот более обычным способом:

c++ -c example.cpp 
cc -c main.c 
c++ -o mypgm main.o example.o 

ПРИМЕЧАНИЕ: В обоих случаях «линкер» должен быть c++, чтобы разрешить std::*, что example.cpp использует


UPDATE:

Что mypgm?

mypgm [только пример имя] имя из [полностью связаны и готов к запуску] вывода исполняемого файла или программы. Это аргумент для опции -o. Компилятор принимает ваш перемещаемый ввод .o файлов, связывает их вместе, чтобы создать выходной файл [который теперь можно запустить как команду].

Это довольно стандартная номенклатура для чего-то произвольного в примере инструкции или последовательности кода [как здесь, на SO]. Вы можете заменить «mypgm» на «ursa_majors_test_program» или «example» или что бы вы ни хотели. Чтобы запустить программу, затем введите ./mypgm [или ./ursa_majors_test_program или ./example]

Там нет волшебной на имя, так же, как не было никакой магии, чтобы вы назвать ваши исходные файлы main.c и example.cpp

Это должно быть описательным функции. Если вы сказали, что работаете над программой редактирования текста, в моем примере я мог бы использовать -o editor

+0

Что такое 'mypgm'? –

+0

Получил это. Спасибо. 'C++ -c example.cpp' ' cc -c main.c' 'C++ -o out example.o main.o' './Out' –