gpt4 book ai didi

c++ - 在代码块链接器错误中混合使用 C 和 C++

转载 作者:行者123 更新时间:2023-11-28 06:42:04 25 4
gpt4 key购买 nike

我有一个 C 头文件如下:

实用程序.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 链接编译的,因此编译器不执行名称修改。因此,这些函数对于 C++ 编译器是不可见的。

为了明确告诉编译器来自给定 header 的函数的特定链接,请使用 extern "C" 将 include 指令包装在 *.cpp 文件中:

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();

关于c++ - 在代码块链接器错误中混合使用 C 和 C++,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25815450/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com