甚至未引用的类方法的未解析外部符号

Unresolved external symbol for classmethod that isn't even referenced

本文关键字:外部 符号 类方法 引用      更新时间:2023-10-16

我正在创建一个简单的调试线程名称数据库(因为您不能在windows中给线程名称,您只能将该名称发送给调试器)。我有这个头文件:

threadname.h

class ThreadNameMap {
public:
    void setThreadName( uint32_t id, const std::string &name );
    std::string getThreadName( const uint32_t id ) const;
    // If ID given as string
    std::string getThreadName( const std::string id ) const;
    // If no ID given, current ID is used
    std::string getThreadName( ) const;
    // A singleton getter
    static ThreadNameMap* ThreadNameMap::getInstance();
    // Static getters that use the singleton
    static std::string getName( const uint32_t id );
    static std::string getName( const std::string id );
    static std::string getName( );
private:
    ThreadNameMap() {maxNameLength = 16;};
    int maxNameLength;
    // Map of ids and names
    std::map<uint32_t, std::string> names;
}; 

这是实现:

threadname.cpp

<>之前ThreadNameMap::getInstance() {static ThreadNameMap = ThreadNameMap();返回本月;}std::string ThreadNameMap::getName(const uint32_t id) {return getInstance()->getThreadName(id);}std::string ThreadNameMap::getName(std::string id) {return getInstance()->getThreadName(id);}std::string ThreadNameMap::getName() {return getInstance()->getThreadName();}void ThreadNameMap::setThreadName(uint32_t id, const std::string &name) {setThreadName_private (id、name.c_str ());如果(id = = 1)id = boostThreadId();[id] = name;}std::string ThreadNameMap::getThreadName(const uint32_t id)如果名字。Count (id)>0返回names.at (id);其他的返回";}std::string ThreadNameMap::getThreadName(const std::string id)threadNumber = 0;sscanf(id.c_str(), "%lx", &threadNumber);返回getThreadName (threadNumber);}/**这个被报告为未引用!!* */std::string ThreadNameMap::getThreadName() const {返回getThreadName (boostThreadId ());} 之前

我使用单例接口,我像这样在我的记录器头文件中访问它:

logger.h

<>之前# include"…路径…/setthreadname.h"#define LOGMTDBG_tmp(debuglevel, logstream) LOGMT(debuglevel (debuglevel) <<datetimeEx & lt; & lt;' ' << ThreadNameMap: getName () & lt; & lt;' ' <<__FUNCTION__ & lt; & lt;' ' <<logstream) 之前

Logger包含在许多其他cpph文件中-无论需要什么地方。其中一些报告未引用的符号:

<>之前未解析的外部符号"public: class std::basic_string,class std::allocator> __cdecl ThreadNameMap::getThreadName(void)"(getThreadName@ThreadNameMap@@QEAA AV ? basic_string@DU ?美元$ char_traits@D@std@@V ? allocator@D@2@@std@@XZ美元)D: techsys RomeoTT RunWindow.obj来源未解析的外部符号"public: class std::basic_string,class std::allocator> __cdecl ThreadNameMap::getThreadName(void)"(?getThreadName@ThreadNameMap@@QEAA?AV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@XZ)引用函数"private: void __cdecl BaseRunPresenter::MessageHandler(类boost::shared_ptr)"(MessageHandler@BaseRunPresenter@@AEAAXV ? shared_ptr@USMSSBase@@@boost@@@Z美元)D: techsys RomeoTT BaseRunPresenter.obj来源未解析的外部符号"public: class std::basic_string,class std::allocator> __cdecl ThreadNameMap::getThreadName(void)"(getThreadName@ThreadNameMap@@QEAA AV ? basic_string@DU ?美元$ char_traits@D@std@@V ? allocator@D@2@@std@@XZ美元)D: techsys RomeoTT BaseRunView.obj来源未解析的外部符号"public: class std::basic_string,class std::allocator> __cdecl ThreadNameMap::getThreadName(void)"(getThreadName@ThreadNameMap@@QEAA AV ? basic_string@DU ?美元$ char_traits@D@std@@V ? allocator@D@2@@std@@XZ美元)D: techsys RomeoTT XmlSestavaRunPresenter.obj来源未解析的外部符号"public: class std::basic_string,class std::allocator> __cdecl ThreadNameMap::getThreadName(void)"(getThreadName@ThreadNameMap@@QEAA AV ? basic_string@DU ?美元$ char_traits@D@std@@V ? allocator@D@2@@std@@XZ美元)D: techsys RomeoTT RunSestavaFrame.obj来源错误18错误LNK2019:无法解析的外部符号"类std::basic_string,类std::allocator> __cdecl getThreadName(void)"在函数"public: void __cdecl SestavaHeader::DataSource::Dump2LOG(void)const"(?Dump2LOG@DataSource@SestavaHeader@@QEBAXXZ) D:techsysRomeoTTSourceSestavaDataSource.obj .)中引用(之前

搜索了项目,但是没有任何一个类非静态方法的引用,只有 logger.h 中的一个。

我检查了许多未引用的外部符号问题,但它们都有两种可能性:

  1. dll缺失-好吧,我没有使用任何dll显然
  2. 函数已声明但未实现——在上面的代码中,您可以看到声明和实现以及它们都匹配

那么为什么链接器会抱怨没有被引用的方法呢?我试图改变const和移动.h文件中的静态方法,没有任何帮助。我现在真的很绝望。

编辑: Visual studio链接器标志:

/OUT:"D:techsysRomeoTTPROJECTPROJECTd.exe" /INCREMENTAL /NOLOGO /LIBPATH:"....libsopenssl64libVCstatic" /LIBPATH:"....libsboost155stagelib64bit" /LIBPATH:"C:Qt5.3.0-64qtbaselib" "libeay32MTd.lib" "Graph64d.lib" "HelpLib64d.lib" "version.lib" "qtmaind.lib" "Qt5Cored.lib" "Qt5Guid.lib" "Qt5Multimediad.lib" "Qt5Sqld.lib" "Qt5PrintSupportd.lib" "Qt5Svgd.lib" "Qt5Widgetsd.lib" "Qt5Xmld.lib" "Qt5XmlPatternsd.lib" "kernel32.lib" "user32.lib" "gdi32.lib" "winspool.lib" "comdlg32.lib" "advapi32.lib" "shell32.lib" "ole32.lib" "oleaut32.lib" "uuid.lib" "odbc32.lib" "odbccp32.lib" /MANIFEST /ManifestFile:"D:techsysXXXXobjx64XXXXDebugXXXXXd.exe.intermediate.manifest" /ALLOWISOLATION /MANIFESTUAC:"level='asInvoker' uiAccess='false'" /DEBUG /PDB:"D:techsysXXXXXXXXXX64XXXXXd.pdb" /SUBSYSTEM:WINDOWS /OPT:NOREF /PGD:"D:techsysXXXXXXXX64XXXXXd.pgd" /TLBID:1 /DYNAMICBASE /NXCOMPAT /MACHINE:X64 /ERRORREPORT:NONE 

您可以通过详细检查错误消息(已清除以确保可见性)来找到可能的罪魁祸首:

<>之前未解析的外部符号"string stringThreadNameMap::getThreadName(void)"在RunWindow.obj中被引用未解析的外部符号"string stringThreadNameMap::getThreadName(void)"在函数"private: void stringBaseRunPresenter::MessageHandler(class boost::shared_ptr)"中被BaseRunPresenter.obj引用未解析的外部符号"string stringThreadNameMap::getThreadName(void)"在BaseRunView.obj中被引用xmlsestavarunpresent .obj中引用的未解析的外部符号"stringThreadNameMap::getThreadName(void)"在RunSestavaFrame.obj中引用的未解析的外部符号"string stringThreadNameMap::getThreadName(void)"未解析的外部符号"string stringThreadNameMap::getThreadName(void)"在函数"public: void stringSestavaHeader::DataSource::Dump2LOG(void)const " SestavaDataSource.obj之前

这些链接错误说明:

  • 一些对象文件(RunWindow。obj, BaseRunPresenter.obj…)包含对非const方法getThreadName()
  • 的引用。
  • 这意味着当方法getThreadName()被声明为非const
  • 时,这些目标文件已经从源文件生成
然而,getThreadName()的声明现在是const:
std::string getThreadName( ) const;

因此,这些目标文件中的每一个都是基于过时的getThreadName()声明编译的,应该重新编译。如果可能,因为可能存在其他(未检测到的)不一致错误,您应该执行完整的重新构建。