Сбой при связывании библиотеки с LINK1181 на VS17

Я пытаюсь использовать потоковую библиотеку ADTF в своем проекте. Когда я включаю библиотеку, я получаю ошибку LNK1181. Библиотека поставляется с заголовками, файлами lib и файлами dll.

Я добавил путь внутри C/C++ -> Общие -> Дополнительные подключаемые каталоги.

Кроме того, я добавил библиотеку в Linker -> Input -> Additional Dependencies.

Вот также скриншот ошибки.

Обновление: я изменил расположение dll и библиотек на свой путь к проекту и снова включил его. На саму библиотеку теперь не жалуется. Теперь я получаю сообщение об ошибке 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_

3 ответа

Решение

Я нашел ответ на проблему. Что ж, сочетание проблем.

Библиотека была создана для поддержки только машин 0x86. Я снова построил его для поддержки 0x64, и он сработал.

PS Он работал и на Visual Studio 2017, к сожалению, документация плохая и не хватает информации.

Вам необходимо указать дополнительные каталоги библиотеки в свойствах компоновщика, чтобы указать каталог, в котором у вас есть файл 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 требует VS 2010 и несовместима с другими версиями! Поэтому обязательно используйте его с инструментами сборки v100. Или перейдите на библиотеку файлов ADTF, также известную как IFHD, которая является преемником, совместимым с v141, и также работает с ADTF 2.x и ADTF 3.x. Обратите внимание, что Lib поставляется с полностью открытым исходным кодом. См. Обзор файла трассировки ADTF.dat.

Другие вопросы по тегам