Как устранить предупреждение «Несогласованная связь DLL (C4273)»? - PullRequest
0 голосов
/ 07 мая 2019

Я прочитал различные вопросы и ответы по «Несогласованной связи DLL», и ни один из них не решает общую проблему, они либо решают проблему для конкретного кода, либо используют Visual Studio.

Я использую программу cl.exe с приглашением Visual Studio Developer. Я следовал за пошаговым руководством для создания DLL в Visual Studio здесь

У меня есть файл MathLibrary.h с

#pragma once
#ifdef MATHLIBRARY_EXPORTS
#define MATHLIBRARY_API __declspec(dllexport)
#else
#define MATHLIBRARY_API __declspec(dllimport)
#endif
extern "C" MATHLIBRARY_API void fibonacci_init(
    const unsigned long long a, const unsigned long long b);
extern "C" MATHLIBRARY_API bool fibonacci_next();
extern "C" MATHLIBRARY_API unsigned long long fibonacci_current();
extern "C" MATHLIBRARY_API unsigned fibonacci_index();

и в файле MathLibrary.cpp это

#include <utility>
#include <limits.h>
#include "MathLibrary.h"
static unsigned long long previous_;  
static unsigned long long current_;
static unsigned index_;    
void fibonacci_init(
    const unsigned long long a,
    const unsigned long long b)
{
    index_ = 0;
    current_ = a;
    previous_ = b; 
}
bool fibonacci_next()
{
   if ((ULLONG_MAX - previous_ < current_) ||
       (UINT_MAX == index_))
    {
        return false;
    }
    if (index_ > 0)
    {
        // otherwise, calculate next sequence value
        previous_ += current_;
    }
    std::swap(current_, previous_);
    ++index_;
    return true;
}
unsigned long long fibonacci_current()
{
    return current_;
}
unsigned fibonacci_index()
{
    return index_;
}

Теперь я использую программу cl.exe в приглашении разработчика, например

cl /LD MathLibrary.cpp

Поскольку файл MathLibrary.h находится в той же директории, это не должно создавать никаких проблем. Я получаю кучу предупреждений "C4273". Это предупреждения "Несогласованная связь DLL".

Я создал MathClient.cpp файл с

#include <iostream>
#include "MathLibrary.h"
int main()
{
    fibonacci_init(1, 1);
    do {
        std::cout << fibonacci_index() << ": "
            << fibonacci_current() << std::endl;
    } while (fibonacci_next());
    std::cout << fibonacci_index() + 1 <<
        " Fibonacci sequence values fit in an " <<
        "unsigned 64-bit integer." << std::endl;
}

Это сработало безупречно, и поэтому я знаю, что нет никаких фатальных ошибок, только эти предупреждения. Я читал, что он генерируется, когда MATHLIBRARY_EXPORTS не определен, и __declspec(dllimport) там вместе с определениями функций.

Я не уверен, как решить эту проблему, поскольку я использую командную строку (приглашение разработчика), и у меня нет возможности установить определения препроцессора

...