Я прочитал различные вопросы и ответы по «Несогласованной связи 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)
там вместе с определениями функций.
Я не уверен, как решить эту проблему, поскольку я использую командную строку (приглашение разработчика), и у меня нет возможности установить определения препроцессора