2016-02-17 2 views
-1

Я пытаюсь скомпилировать функцию в C++, а затем взять выходной файл объекта и скомпилировать его в функцию C. Во время ссылки я получаю сообщение об ошибке. Вот код:Ошибка связи GNU C и C++

row_executor.c:

#include "row_exec.h" 

void row_executor(char* row) { 
    row_exec(row); 
    return; 
} 

row_exec.h

#ifndef ROWEXEC_CPP_H 
#define ROWEXEC_CPP_H 

#ifdef __cplusplus 
//fill in C++ code here later 
#endif 

#ifdef __cplusplus 
extern "C" { 
#endif 

    void row_exec(char* rowname); 

#ifdef __cplusplus 
} //end extern "C" 
#endif 

#endif 

row_exec.cpp:

#ifdef __cplusplus 
#include "row_exec.h" 
#include <iostream> 

using namespace std; 

void row_exec(char* rowname) { 
    cout << "Row name is: " << rowname << endl; 
} 

#endif 

C++ объектный файл генерируется запись Makefile:

row_exec.o: row_exec.cpp row_exec.h 
    g++ -Wall -c row_exec.cpp 

Файл объект C генерируется:

gcc -c -I<include paths> -g -fPIC -DPIC -o row_exec.o row_executor.c 

Оба генерируют объектные файлы в порядке, но когда row_executor.o компонуется вместе с кучей других файлов не связанных объектов, соответствующих другим тестам, я получаю следующее сообщение об ошибке:

row_executor.o (.text + 0x1a): В функции row_executor': /LAB/MODULES/rev_13~~/row_executor.c:4: undefined reference to row_exec» collect2: л.д. возвращается 1 выходной статус марка: *** [hm_prod_rev_16.so] ошибка 1

ли кто-нибудь см. вопрос?

+0

Внимательно прочитайте первый файл! – Olaf

+0

Можете ли вы дать мне подсказку? Это не очевидно для меня. –

+1

Почему downvote? – Phong

ответ

1
row_exec.o: row_exec.cpp row_exec.h 
    g++ -Wall -c row_exec.cpp 
gcc -c -I<include paths> -g -fPIC -DPIC -o row_exec.o row_executor.c 

Ваш объектный файл для row_exec.c и row_executor.c тот же. Один из ваших объектных файлов перезаписывается.

+0

Спасибо за полезный ответ. Я думал, что флаг -o должен указать объектный файл для включения. Как вы указали, оно фактически указывает имя файла выходного объекта. Возможно, мне не нужно включать объектный файл C++ (row_exec.o) до окончательной стадии компоновки. Я попробую это и посмотрю, что произойдет. –

+0

Да, вам не нужен другой объектный файл для компиляции (не ссылки) другого файла. вам просто нужны они, когда вы связываете весь объектный файл в один. Здесь факт, что c и C++-файл используются вместе, не имеет значения. – Phong

+0

Обновление: На самом деле, я не могу просто добавить файл row_exec.o на этапе окончательной компоновки, потому что окончательная компоновка выполняется с использованием gcc и row_exec.o была скомпилирована с g ++. Так почему-то мне нужно/нужно компилировать/link row_exec.o "в" row_executor.c с помощью g ++. Затем этот вывод можно связать с помощью gcc с остальными файлами-объектами, созданными gcc. Кто-нибудь знает как это сделать? –

Смежные вопросы