Компиляция и компоновка файлов C и C ++

0

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

Предположим, у меня есть файл C MyProg.c и соответствующий заголовочный файл MyProg.h.

Теперь я создал два файла Wrapper.cpp и Wrapper.h, которые объявляют функцию, которую я хочу вызвать из MyProg.c

// Wrapper.h
#include "Utility.h"

#ifdef __cplusplus
extern "C" {
#endif

void func_to_invoke();

#ifdef __cplusplus
     }
#endif

Обратите внимание, что Wrapper.h содержит файл, содержащий другие функции C++.

Вопрос заключается в том, как скомпилировать и связать файлы. Должен ли я сделать следующее:

g++ -c Utility.cpp Utility.h
g++ -c Wrapper.cpp Wrapper.h Utility.h
gcc -c MyProg.c MyProg.h Wrapper.h

gcc MyProg.o Wrapper.o

РЕДАКТИРОВАТЬ:

Я пробовал следующее, и я до сих пор не могу скомпилировать. У меня есть страницы и страницы ошибок, связанных с библиотеками C++. Должен ли я также объявлять все функции в Utility.h в макросе __cplusplus?

g++ -c Utility.cpp
g++ -c Wrapper.cpp 
gcc -c MyProg.c 
g++ MyProg.o Wrapper.o Utility.

РЕШЕНИЕ:

Utility.h необходимо удалить из Wrapper.h и включить в Wrapper.cpp

  • 0
    Я думаю, что последний вызов должен быть gcc MyProg.o Wrapper.o Utility.o
  • 0
    Вам не нужно указывать файлы ".h" для компилятора, он найдет их из операторов "#include".
Показать ещё 3 комментария
Теги:
compilation

3 ответа

3
Лучший ответ

Не включайте файл.cpp в заголовок Wrapper. Это совсем не то, что нужно делать. Даже не включать заголовок Utility.h. Просто определите свою функцию обертки. Затем в Wrapper.cpp включите заголовок Utility.h и определите функцию обертки.

Если ваш код C++ использует исключения или информацию о времени выполнения, вам нужно будет сделать заключительную ссылку с g++. Для вашей программы потребуется библиотека поддержки C++.

Я бы написал так:

g++ -c Utility.cpp
g++ -c Wrapper.cpp
gcc -c MyProg.c
g++ -o MyProg Utility.o MyProg.o Wrapper.o
  • 0
    +1: я тоже
  • 0
    Я попробовал именно это, и я до сих пор не могу скомпилировать. У меня есть страницы и страницы ошибок, связанных с библиотеками C ++. Должен ли я также объявить все функции в Utility.h в макросе __cplusplus?
Показать ещё 4 комментария
1

После того, как вы скомпилировали Wrapper.cpp в объектный код, действительно не имеет значения, было ли его содержимое ранее написано на C или C++, если вы используете extern "C" чтобы сообщить компилятору пропустить имя mangling для func_to_invoke,

Если я хорошо помню, как gcc и g++ могут определить, содержат ли их входные файлы код C или C++ и делают правильные вещи, но gcc будет ссылаться на стандартную библиотеку C и g++ на C++ поэтому возможно, что у вас есть недостающие функциональные возможности.

Я думаю, что лучшим способом было бы использовать gcc для всего, что не использует функцию C++, как это было бы в случае с C и g++ для всего остального.

  • 0
    Да, но вы можете остаться без поддержки библиотеки
  • 0
    О да, разве gcc ссылается на стандартную библиотеку C, тогда как g++ делает это с C ++?
Показать ещё 2 комментария
0

вы должны включить Utility.o в последнюю строку.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню