У меня есть заголовок 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, но по какой-то нечетной причине два объектных файла не могут быть связаны друг с другом.
Любые идеи, что я делаю неправильно?
Файл 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();
extern "C" void GetDesktopResolution(int* width, int* height);
?Utilities.h error: expected identifier or '(' before string constant
потому что это файл заголовкаC