在 VS17 上链接库失败并显示 LINK1181
Linking a library fails with LINK1181 on VS17
我正在尝试在我的项目中使用 ADTF 流媒体库。当我包含库时,出现 LNK1181 错误。该库附带 headers、lib 文件和 dll 文件。
我在 C/C++ -> General -> Additional Include Directories 中添加了路径。
另外,我在Linker -> Input -> Additional Dependencies里面添加了library。
这里也是错误截图。
更新:我已经将dll和libs的位置更改为我的项目路径并再次包含它。它现在不抱怨 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();
}
并且试图读取/导入我的库的 header 文件是
#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_
您需要在链接器属性中指定附加库目录,以设置您拥有 lib 文件的目录。您不需要将库包含在附加依赖项中,因为当您在调试中编译您的应用程序时,您是在 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代码中有人定义了这个宏。因为在你的代码中你没有(你不能)定义这个宏,这个函数是导入函数。
ADTF Streaming Library 需要VS 2010,与其他版本不兼容!所以请确保将它与 v100 构建工具一起使用。或者更改为 ADTF 文件库 a.k.a。 IFHD,它是 v141 兼容的继任者,也适用于 ADTF 2.x 和 ADTF 3.x。请注意,该库是完全开源许可的。请参阅 ADTF .dat trace file reader 了解一些概述
我找到了问题的答案。嗯,问题的组合。
该库仅支持 0x86 机器。我再次构建它以支持 0x64 并且它有效。
P.S。它也适用于 Visual Studio 2017,不幸的是文档很差并且缺乏信息。
我正在尝试在我的项目中使用 ADTF 流媒体库。当我包含库时,出现 LNK1181 错误。该库附带 headers、lib 文件和 dll 文件。
我在 C/C++ -> General -> Additional Include Directories 中添加了路径。
另外,我在Linker -> Input -> Additional Dependencies里面添加了library。
这里也是错误截图。
更新:我已经将dll和libs的位置更改为我的项目路径并再次包含它。它现在不抱怨 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();
}
并且试图读取/导入我的库的 header 文件是
#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_
您需要在链接器属性中指定附加库目录,以设置您拥有 lib 文件的目录。您不需要将库包含在附加依赖项中,因为当您在调试中编译您的应用程序时,您是在 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代码中有人定义了这个宏。因为在你的代码中你没有(你不能)定义这个宏,这个函数是导入函数。
ADTF Streaming Library 需要VS 2010,与其他版本不兼容!所以请确保将它与 v100 构建工具一起使用。或者更改为 ADTF 文件库 a.k.a。 IFHD,它是 v141 兼容的继任者,也适用于 ADTF 2.x 和 ADTF 3.x。请注意,该库是完全开源许可的。请参阅 ADTF .dat trace file reader 了解一些概述
我找到了问题的答案。嗯,问题的组合。
该库仅支持 0x86 机器。我再次构建它以支持 0x64 并且它有效。
P.S。它也适用于 Visual Studio 2017,不幸的是文档很差并且缺乏信息。