gpt4 book ai didi

c++ - 什么可能导致此链接器错误?

转载 作者:行者123 更新时间:2023-11-28 07:58:18 25 4
gpt4 key购买 nike

几个小时以来,我一直试图在静态变量上解决这个 Unresolved external symbol ,但我已经束手无策了。我使用的是 Visual Studio 2010。以下是对情况的简要概述:

有问题的项目:

-ProjA (outputs a .dll and .lib)
-ProjB (outputs a .exe)

在 ProjA 中,我有这两个文件:

//foo.h
#pragma once

class SUP
{
public:
static int staticint;
};

//foo.cpp
#include "foo.h"
int SUP::staticint = 10;

ProjB 链接到 ProjA.lib

//main.cpp
#include "{Full_Path}foo.h"
int main(){
std::cout << SUP::staticint << std:: endl;
}

现在,main.cpp 编译没有任何问题,但是当我尝试构建项目时,出现以下错误:

main.obj:错误 LNK2001:未解析的外部符号“public:static int SUP::staticint”(?staticint@SUP@@2HA)

我几乎 100% 确定我已经正确设置了 ProjB 的选项。在“附加依赖项”下,我有“ProjA.lib”,在“附加库目录”下,我有生成 ProjA.lib 文件的目录的路径。

我什至让 ProjA 输出了一个 .map 文件,在 map 中我发现:0003:00004458 ?staticint@SUP@@2HA 10049458 foo.obj

所以我猜测这意味着 staticint 已被正确定义。

可能出了什么问题?显然,我做错了什么,但我看不出是什么。我已确保 ProjB 与正确的 .lib 文件链接。我已经确定包含目录是好的。我已经确保静态变量的定义是正确的。如有必要,我会提供任何其他信息。

最佳答案

在 MSVS 下,您必须使用 __declspec(dllexport) 显式声明要导出的符号。

由于 SUP 在不同的库中,只有导出的符号可供其他模块使用,这些模块必须将它们标记为 __declspec(dllimport)

这种双重行为通常是通过宏实现的:

#ifdef EXPORT_MODULE
#define DLLIMPEXP __declspec(dllexport)
#else
#define DLLIMPEXP __declspec(dllimport)
#endif

类声明为

class DLLIMPEXP SUP
{
public:
static int staticint;
};

其中 EXPORT_MODULE 在导出符号的项目中定义。

关于c++ - 什么可能导致此链接器错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12149516/

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