Я хотел бы вызвать функцию 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
Не включайте файл.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
После того, как вы скомпилировали Wrapper.cpp
в объектный код, действительно не имеет значения, было ли его содержимое ранее написано на C или C++, если вы используете extern "C"
чтобы сообщить компилятору пропустить имя mangling для func_to_invoke
,
Если я хорошо помню, как gcc
и g++
могут определить, содержат ли их входные файлы код C или C++ и делают правильные вещи, но gcc
будет ссылаться на стандартную библиотеку C и g++
на C++ поэтому возможно, что у вас есть недостающие функциональные возможности.
Я думаю, что лучшим способом было бы использовать gcc
для всего, что не использует функцию C++, как это было бы в случае с C и g++
для всего остального.
gcc
ссылается на стандартную библиотеку C, тогда как g++
делает это с C ++?
вы должны включить Utility.o в последнюю строку.
gcc MyProg.o Wrapper.o Utility.o