C++学习(四五五)error: LNK2019: 无法解析的外部符号

本文探讨了在库中使用嵌套结构体时遇到的问题,特别是当这些结构体定义了构造函数时,在库外部创建实例所引发的错误。通过具体的代码示例,分析了错误的原因,并给出了可能的解决方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

库中嵌套结构体/类有以下情况报错:

1、嵌套结构体/类定义有构造函数,在库外定义该嵌套结构体/类对象时报错。

2、嵌套结构体/类定义无构造函数,但是定义有其它函数,在库外定义该嵌套结构体/类对象不报错,访问其函数时报错。

应该是class中struct中的函数的不可见的,如果ProgramEntry中也定义一个函数,访问该函数也会提示无法解析的外部符号。将struct换为class也有此问题。

osgEarth/VirutalProgram
class OSGEARTH_EXPORT VirtualProgram : public osg::StateAttribute
{
    public:        
        struct ShaderEntry
        {
            ShaderEntry();
            bool accept(const osg::State& state) const;
            osg::ref_ptr<PolyShader>                 _shader;
            osg::StateAttribute::OverrideValue       _overrideValue;
            osg::ref_ptr<ShaderComp::AcceptCallback> _accept;
            bool operator < (const ShaderEntry& rhs) const;
        };

        struct ProgramEntry
        {
            osg::ref_ptr<osg::Program> _program;
            unsigned                   _frameLastUsed;
        };
}
osgEarth/VirtualProgram.cpp
VirtualProgram::ShaderEntry::ShaderEntry() :
_overrideValue(0)
{
    //nop
}

bool
VirtualProgram::ShaderEntry::accept(const osg::State& state) const
{
    return (!_accept.valid()) || (_accept->operator()(state) == true);
}

bool
VirtualProgram::ShaderEntry::operator < (const VirtualProgram::ShaderEntry& rhs) const
{
    if ( _shader->getShaderSource().compare(rhs._shader->getShaderSource()) < 0 ) return true;
    //if ( _shader->compare(*rhs._shader.get()) < 0 ) return true;
    if ( _overrideValue < rhs._overrideValue ) return true;
    if ( _accept.valid() && !rhs._accept.valid() ) return true;
    return false;
}

osgEarth::VirtualProgram::ProgramEntry aaa;
osgEarth::VirtualProgram::ShaderEntry bbb;
osgEarth::VirtualProgram::ShaderEntry* ccc;

第一、三句不报错,第二句报错:

main.obj:-1: error: LNK2019: 无法解析的外部符号 "public: __thiscall osgEarth::VirtualProgram::ShaderEntry::ShaderEntry(void)" (??0ShaderEntry@VirtualProgram@osgEarth@@QAE@XZ),该符号在函数 _main 中被引用

第二句改为如下即可(这是有问题的,相当于定义了一个函数):

osgEarth::VirtualProgram::ShaderEntry bbb();

做了一个生成动态库的测试,里面定义了一个class,class中定义了一个struct,如下。如果直接访问如下,是会报错的,如果将struct的构造函数去掉则不会报错。猜测是struct的显式构造函数被隐藏了。

TestClassLib::TestStruct eee;
#ifndef TESTCLASSLIB_H
#define TESTCLASSLIB_H

#include "testclasslib_global.h"

class TESTCLASSLIBSHARED_EXPORT TestClassLib
{

public:
    TestClassLib();

public:
    struct TestStruct{
        TestStruct();
        bool accept(int i) const;
        int       _overrideValue;
        int* _accept;
        bool operator < (const TestStruct& rhs) const;
    };
};

#endif // TESTCLASSLIB_H

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值