【问题标题】:Linking a library fails with LINK1181 on VS17在 VS17 上使用 LINK1181 链接库失败
【发布时间】:2019-10-29 09:55:55
【问题描述】:

我正在尝试在我的项目中使用 ADTF 流媒体库。当我包含库时,我收到 LNK1181 错误。该库带有头文件、lib 文件和 dll 文件。

我已经在 C/C++ -> General -> Additional Include Directories 里面添加了路径。

另外,我在 Linker -> Input -> Additional Dependencies 里面添加了库。

这里也是错误截图。

更新:我已将 dll 和库的位置更改为我的项目路径并再次包含它。它现在不会抱怨 lib 本身。现在我收到一个错误 LNK2001。我相信这也是一个链接器错误。

这一切都出了问题!

更新 2: 在我看到构建的完整日志之后。这出现了,我认为这意味着,链接器找不到我的库。对吗?

主要应用代码如下:

#include "pch.h"
#include <iostream>
#include "adtf_streaming.h"
using namespace adtfstreaming;

int main()
{
    std::cout << "Hello World!\n"; 
    IADTFFileReader *pFileReader = IADTFFileReader::Create();

}

而试图读取/导入我的库的头文件是

#ifndef _ADTF_STREAMING_LIBRARY_DLL_ 
#define _ADTF_STREAMING_LIBRARY_DLL_

#ifdef WIN32
    #ifdef STREAMINGLIB_EXPORTS
        #pragma message ("Create ADTF Streaming Library ")
        // export symbols
        #define DOEXPORT __declspec( dllexport )
    #else
        #pragma message ("Use dynamic ADTF Streaming Library ")
        #ifdef _DEBUG
            #pragma comment( lib, "adtfstreamingD_290.lib" )
        #else
            #pragma comment( lib, "adtfstreaming_290.lib" )
        #endif

        #define DOEXPORT __declspec( dllimport )
    #endif
#else
    #ifdef STREAMINGLIB_EXPORTS
        #define DOEXPORT __attribute__ ((visibility("default")))
    #else
        #pragma comment( lib, "adtfstreaming_290.lib" )
        #define DOEXPORT __declspec( dllimport )
    #endif
#endif

//standard includes 
#include <stdlib.h>
#include <string.h>

//adtf base types and errors
#include "adtf_base_ref.h"

//streaming lib version
#include "adtf_streaming_version.h"

//adtf streaming lib package headers
#include "adtf_streaming_pkg.h"

#endif //_ADTF_STREAMING_LIBRARY_DLL_

【问题讨论】:

  • 1.这些库真的存在于那个位置吗? 2、你是否设置了所有项目配置的路径和文件?例如发布和调试?您可能已经为一个项目配置设置了它,但没有为另一个项目配置设置它,这是配置发布但未配置调试时的常见疏忽
  • 您应该只将发布或调试库添加到每个配置,而不是发布和调试。所以为发布配置添加发布库,为调试配置添加调试库
  • 它在发布/调试中是否编译正常或两者都失败?您需要查看您的相关错误,因为您的问题现在已转移到另一个问题。此外,我和其他人很难在没有代码的情况下帮助你重现你的错误。您可以将标志 `/VERBOSE' 添加到链接器高级选项中,以从链接器获取完整输出,以检查路径等是否真的正确
  • 你应该将你的 lib 文件夹路径添加到 Linker -> General -> "Additional Library Directories" 而不是 "Additional Include Directories"。
  • 您已将 lib 路径添加到包含路径中,您的 lib 路径位于此页面下的“C/C++->Linker->General”下是“附加库目录”的条目添加你的 lib 路径

标签: c++ visual-studio-2017 libraries visual-studio-2017-build-tools adtf


【解决方案1】:

您需要在链接器属性中指定附加库目录,以设置您拥有 lib 文件的目录。您不需要在 Additional Dependencies 中包含这些库,因为您在调试中编译应用程序时在 lib 头文件 #pragma comment( lib, "adtfstreamingD_290.lib" ) 中执行此操作,或者在发布时编译时在 #pragma comment( lib, "adtfstreaming_290.lib" ) 中执行此操作。但是您需要指定这些库在附加库目录中的位置。

如果您看到 lib 包含文件,您会看到如果定义了 STREAMINGLIB_EXPORTS 宏,则所有带有 DOEXPORT 修饰符的函数都是导出函数#define DOEXPORT __declspec( dllexport )。但是如果这个宏没有定义#define DOEXPORT __declspec( dllimport ),同样的函数就是导入函数。就是因为dll需要指定这个函数是导出函数,所以在dll代码中已经有人定义了这个宏。因为在您的代码中您没有(而且您不能这样做)定义这个宏,所以这个函数是导入函数。

【讨论】:

    【解决方案2】:

    ADTF Streaming Library 需要 VS 2010 并且与其他版本不兼容!因此,请确保将其与 v100 构建工具一起使用。或者更改为 ADTF 文件库(又名 IFHD),它是与 v141 兼容的继任者,也适用于 ADTF 2.x 和 ADTF 3.x。请注意,Lib 完全开源许可。有关概述,请参阅ADTF .dat trace file reader

    【讨论】:

    • 感谢@C-3PFLO 的回答!您提供的链接包含一个非常旧版本的库。
    【解决方案3】:

    我找到了问题的答案。好吧,问题的组合。

    该库仅支持 0x86 机器。我重新构建了它以支持 0x64,它工作正常。

    附:它也适用于 Visual Studio 2017,不幸的是文档很差并且缺少信息。

    【讨论】:

    • 由于我也有链接错误,您是如何重建 ADTF 流媒体库的,因为 .cpp 文件都丢失了?
    • @TobiasBrösamle 您实际上可以使用 0x64 版本的库。
    • 我已经通过创建一个 cmake 项目解决了这个问题。在那里,不存在任何问题。
    猜你喜欢
    • 2014-03-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-25
    • 1970-01-01
    • 2019-05-04
    • 2013-05-07
    相关资源
    最近更新 更多