【问题标题】:How to solve linker error in C++ when only static methods are affected?当仅影响静态方法时,如何解决 C++ 中的链接器错误?
【发布时间】:2020-03-23 04:47:40
【问题描述】:

我正在使用我无法控制的外部库,更准确地说是 ADTF 流媒体库。 我在 Visual Studio 2019 中链接到这个库(使用 VS 2010 平台工具集)。为此,我将包含目录添加到

ProjectName -> Properties -> C/C++ -> General, 

包含lib的文件夹的路径

ProjectName -> Properties -> Linker -> General 

和库的名称(adtfstreamingD_280.lib)到

ProjectName -> Properties -> Linker -> Input.

不,我收到链接器错误,但仅针对静态类方法,非静态方法没有链接器错误。有谁知道如何解决这样的问题?任何帮助将不胜感激。

我的代码:

头文件:

#ifndef _DAT_HANDLER_H_
#define _DAT_HANDLER_H_

#include <string>
#include <stdint.h>

#include "adtf_streaming.h"

class DatHandler
{
public:
    DatHandler();
    ~DatHandler();
    void Load(std::string datFilePath);
    int32_t GetNumOfStreams();

protected:

private:
    // Resources are handled by ADTF
    adtfstreaming::IADTFFileReader* m_fileReader;   

};
#endif // _DAT_HANDLER_H_

cpp 文件:

#include "DatHandler.h"

DatHandler::DatHandler() : m_fileReader(nullptr)
{
    // do nothing
}

DatHandler::~DatHandler()
{
    if (nullptr != m_fileReader)
    {
        m_fileReader->Close();
        adtfstreaming::IADTFFileReader::Release(m_fileReader);
    }
}

int32_t DatHandler::GetNumOfStreams()
{
    int32_t streamCount;
    tResult res = m_fileReader->GetStreamCount(streamCount);
    if (IS_FAILED(res))
    {
        return -1;
    }
    return streamCount;
}

void DatHandler::Load(std::string path)
{
    if (nullptr == m_fileReader)
    {
        m_fileReader = adtfstreaming::IADTFFileReader::Create();
    }
    else
    {
        m_fileReader->Close();
    }
    m_fileReader->Open(path.c_str());
}

错误(德语,不知道如何得到英文的错误输出):

Error   LNK2019 Verweis auf nicht aufgelöstes externes Symbol ""__declspec(dllimport) public: static long __cdecl adtfstreaming::IADTFFileReader::Release(class adtfstreaming::IADTFFileReader *)" (__imp_?Release@IADTFFileReader@adtfstreaming@@SAJPAV12@@Z)" in Funktion ""public: __thiscall DatHandler::~DatHandler(void)" (??1DatHandler@@QAE@XZ)".

Error   LNK2019 Verweis auf nicht aufgelöstes externes Symbol ""__declspec(dllimport) public: static class adtfstreaming::IADTFFileReader * __cdecl adtfstreaming::IADTFFileReader::Create(void)" (__imp_?Create@IADTFFileReader@adtfstreaming@@SAPAV12@XZ)" in Funktion ""public: void __thiscall DatHandler::Load(class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> >)" (?Load@DatHandler@@QAEXV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@@Z)".

Error   LNK1120 2 nicht aufgelöste externe Verweise.    

编辑:也许我还应该提到我只有 ADTF 流媒体库 2.8.0 可用。

【问题讨论】:

  • 这能回答你的问题吗? Linking a library fails with LINK1181 on VS17
  • @Alan:我尝试定义 STREAMINGLIB_EXPORTS,但没有成功。此外,我没有链接器错误 1181。接受的答案建议构建流媒体库 fox x64,但老实说,我不完全知道我应该如何做缺少 .cpp 文件。
  • 老实说,我不认为这是链接问题的重复。在那里,找不到 .lib 文件,这似乎不是问题。就我而言,只有静态方法在链接时会出现问题。
  • 就我而言,您可能不会定义类的静态成员。静态类成员必须具有唯一定义,否则将违反单一定义规则。不能内联定义的静态类成员必须使用其完全限定名称在一个源文件中定义。如果根本没有定义,链接器会生成 LNK2019。您也可以将符号定义为静态,然后在文件外引用它。有关更多详细信息,我建议您可以参考链接:docs.microsoft.com/en-us/cpp/error-messages/tool-errors/…
  • @MSFT:但它应该在 lib 中编译,对吧?我的意思是,ADTF 本身也使用相同的库,即它应该在原则上工作。

标签: c++ visual-studio dll linker


【解决方案1】:

尽管我的问题和链接的答案都有所有 cmets,但我无法仅使用 Visual Studio 使其工作。

但是,在设置 CMake 项目后,它开箱即用。所以我想使 ADTF 流媒体库工作的最简单方法是创建一个 CMake 项目。

由于流媒体库位于 external/adtf-streaminglib 中,因此在 CMake 中只需以下两行代码:

find_package(ADTF_STREAMING 2.8.0 PATHS ${CMAKE_CURRENT_SOURCE_DIR}/external/adtf-streaminglib REQUIRED)
target_link_libraries(TARGET ${ADTF_STREAMING_LIB})

变量${ADTF_STREAMING_LIB} 由找到的包定义。我不知道为什么我无法将库与 Visual Studio 正确链接,我只能猜测使用 CMake,设置了一些我在 Visual Studio 中找不到或不可用的参数。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-27
    • 1970-01-01
    • 1970-01-01
    • 2012-01-17
    相关资源
    最近更新 更多