gpt4 book ai didi

c++ - 在库的情况下对函数的 undefined reference

转载 作者:太空宇宙 更新时间:2023-11-04 01:59:44 25 4
gpt4 key购买 nike

我正在将代码从 Visual Studio 移植到 Mingw GCC。该组件在 Visual Studio 中运行良好,但 Mingw GCC 提示对函数的 undefined reference 。我已经隔离了情况并将代码放在这里

文件:Rng.h

#pragma once

#ifdef RNG_EXPORTS
#define RNG_API __declspec(dllexport)
#else
#define RNG_API __declspec(dllimport)
#endif

RNG_API unsigned long GetRandom(unsigned long range);

文件:Rng.cpp

#include "Rng.h"
#include "RngKiss.h"

static TRngFile gRngFile;

unsigned long GetRandom(unsigned long range)
{
gRngFile.generate_rnd(); //Linker Error : Undefined Reference to function.

....
}

文件:RngKiss.h

#ifndef __RNGKISS_H__
#define __RNGKISS_H__

#ifndef ULONG
typedef unsigned long ULONG;
#endif //ULONG


typedef struct
{
ULONG w, x, y, z;
} TRngRecord;


typedef struct
{
TRngRecord current, seed;
ULONG generate_rnd(void);
} TRngFile;

#endif

文件:RngKiss.cpp

#include "RngKiss.h"


ULONG TRngFile::generate_rnd(void)
{
ULONG d;
return d;
}

这是我的输出。

g++.exe -L..\..\..\mingw64\lib\boost -o bin\Debug\TestCodeBlocks.exe obj\Debug\main.o obj\Debug\Rng.o obj\Debug\RngKiss.o   
obj\Debug\Rng.o: In function `GetRandom(unsigned long)':
C:/Users/admin/TestCodeBlocks/Rng.cpp:8: undefined reference to `TRngFile::generate_rnd()'
collect2.exe: error: ld returned 1 exit status

关于为什么我会收到此链接器错误以及如何解决它有什么建议吗?

最佳答案

你在你的 mingw64 编译器中遇到了一个错误(或者至少是一个怪癖),在相当晦涩的问题上编译未命名的结构。不知道你是什么版本,我的mingw32 4.8.1具有相同的行为:

rngKiss.h 中的这些 typedef:-

typedef struct
{
ULONG w, x, y, z;
} TRngRecord;


typedef struct
{
TRngRecord current, seed;
ULONG generate_rnd(void);
} TRngFile;

你可能认为他们分别定义了一个名为TRngRecordstruct 类型和另一个名为TRngFile,但严格来说,它们将 TRngRecordTRngFile 定义为 struct 类型的别名它们本身是未命名的。

区别应该只是概念上的。所以这是为了微软的编译器和 for TDM GCC 4.9.2在 Windows 上,所以它适用于Linux 上的 GCC 4.9.2 和 clang 3.5.1。

但是,我们的 mingw 编译器似乎将 unnamed struct 的成员类型定义为TRngFile 必须有静态链接。我的生成:

Dump of file rngKiss.o

File Type: COFF OBJECT

COFF SYMBOL TABLE
000 00000000 DEBUG notype Filename | .file
rngKiss.cpp
002 00000000 SECT1 notype () Static | __ZN8TRngFile12generate_rndEv
...

因此出现链接错误。而 TDM GCC 4.9.2 生成:

Dump of file rngKiss.o

File Type: COFF OBJECT

COFF SYMBOL TABLE
000 00000000 DEBUG notype Filename | .file
rngKiss.cpp
002 00000000 SECT1 notype () External | _ZN8TRngFile12generate_rndEv
...

有 3 种解决方案:

改变你的编译器,比如 TDM GCC。

为你定义的 struct 命名:

typedef struct TRngRecord
{
ULONG w, x, y, z;
} TRngRecord;


typedef struct TRngFile
{
TRngRecord current, seed;
ULONG generate_rnd(void);
} TRngFile;

或者最重要的是:

删除 typedef,这是 C++ 中一种奇怪且不必要的类命名方式:

struct TRngRecord
{
ULONG w, x, y, z;
};

struct TRngFile
{
TRngRecord current, seed;
ULONG generate_rnd(void);
};

....

#include "rngKiss.h"
...
static TRngFile gRngFile;

关于c++ - 在库的情况下对函数的 undefined reference ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28909558/

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