Смешивание C & C ++ в коде ошибки компоновщика

0

У меня есть заголовок C следующим образом:

Utilities.h:

extern SHM shm; //a struct.

extern void GetDesktopResolution(int* width, int* height);

extern bool CreateSharedMemory(uintptr_t id);

extern bool OpenSharedMemory(uintptr_t id);

extern bool UnMapSharedMemory();

и реализация представляет собой файл.c, который просто реализует перечисленные выше функции:

SHM shm = {0};

bool CreateSharedMemory(uintptr_t id)
{
    //...
}

bool OpenSharedMemory(uintptr_t id)
{
    //...
}

bool UnMapSharedMemory()
{
    //...
}

Это прекрасно компилируется.

Затем у меня есть файл main.cpp следующим образом:

#include "Utilities.h"


void swapBuffers(void* dsp, unsigned long wnd)
{
    if (!shm.mapped)
    {
        #if defined _WIN32 || defined _WIN64
        OpenSharedMemory((uintptr_t)dsp) || CreateSharedMemory((uintptr_t)dsp);
        #else
        OpenSharedMemory((uintptr_t)wnd) || CreateSharedMemory((uintptr_t)wnd);
        ftruncate(shm.hFile, shm.size);
        #endif // defined
    }
}
#endif // defined

Когда я его компилирую, я получаю:

obj\Release\src\main.o:main.cpp:(.text+0x249): undefined reference to 'OpenSharedMemory(unsigned int)'

obj\Release\src\main.o:main.cpp:(.text+0x26c): undefined reference to 'CreateSharedMemory(unsigned int)'

c:/mingw64/bin/../lib/gcc/x86_64-w64-mingw32/4.8.1/../../../../x86_64-w64-mingw32/bin/ld.exe: obj\Release\src\main.o: bad reloc address 0x1 in section '.text.startup'

collect2.exe: error: ld returned 1 exit status

Однако, если я изменяю "main.cpp" на "main.c", он компилируется отлично. Я проверил и файл.cpp скомпилирован с помощью g++, а файлы.c скомпилированы с помощью gcc, но по какой-то нечетной причине два объектных файла не могут быть связаны друг с другом.

Любые идеи, что я делаю неправильно?

  • 0
    Вы пробовали: extern "C" void GetDesktopResolution(int* width, int* height); ?
  • 0
    Я сделал. Когда я это делаю, он печатает: Utilities.h error: expected identifier or '(' before string constant потому что это файл заголовка C
Показать ещё 3 комментария
Теги:
gcc

1 ответ

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

Файл Utilities.c был /, вероятно, скомпилирован с помощью C linkage, поэтому компилятор не выполняет обработку имени. Таким образом, эти функции невидимы для компилятора C++.

Чтобы явно рассказать компилятору о конкретной привязке функций из заданных заголовков, оберните директиву include в *.cpp файлах с помощью extern "C":

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

или создать отдельный файл заголовка (например, Utilities.hpp) со следующим содержимым:

extern "C" void GetDesktopResolution(int* width, int* height);

extern "C" bool CreateSharedMemory(uintptr_t id);

extern "C" bool OpenSharedMemory(uintptr_t id);

extern "C" bool UnMapSharedMemory();

Ещё вопросы

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