Я все еще изучаю некоторые способы использования языка C ++.
Итак, я решил создать свою библиотеку (динамическую) и импортировать ее в свой проект. Я выполнил некоторые шаги из учебника в Интернете, но у меня всегда есть ошибка неразрешенного внешнего ...
Разрешите перейти к проекту DLL:
File1.cpp:
#include "MathFuncsDll.h"
#include <stdexcept>
using namespace std;
namespace MathFuncs
{
double MyMathFuncs::Add(double a, double b)
{
return a + b;
}
double MyMathFuncs::Subtract(double a, double b)
{
return a - b;
}
double MyMathFuncs::Multiply(double a, double b)
{
return a * b;
}
double MyMathFuncs::Divide(double a, double b)
{
if (b == 0)
{
throw invalid_argument("b cannot be zero!");
}
return a / b;
}
}
MathFuncs.h:
#ifdef MATHFUNCSDLL_EXPORTS
#define MATHFUNCSDLL_API __declspec(dllexport)
#else
#define MATHFUNCSDLL_API __declspec(dllimport)
#endif
namespace MathFuncs
{
// This class is exported from the MathFuncsDll.dll
class MyMathFuncs
{
public:
// Returns a + b
static MATHFUNCSDLL_API double Add(double a, double b);
// Returns a - b
static MATHFUNCSDLL_API double Subtract(double a, double b);
// Returns a * b
static MATHFUNCSDLL_API double Multiply(double a, double b);
// Returns a / b
// Throws const std::invalid_argument& if b is 0
static MATHFUNCSDLL_API double Divide(double a, double b);
};
}
Результат: скомпилировано успешно (есть файлы Project1.dll и Project1.lib).
Запущено новое консольное приложение со следующими данными:
File1.cpp:
// MyExecRefsDll.cpp
// compile with: /EHsc /link MathFuncsDll.lib
#include <iostream>
#include <Windows.h>
#include "MathFuncsDll.h"
using namespace std;
int main()
{
double a = 7.4;
int b = 99;
try {
LoadLibrary(TEXT("MathFuncsDll.dll")); // Also tried without TEXT();
cout << "a + b = " <<
MathFuncs::MyMathFuncs::Add(a, b) << endl;
cout << "a - b = " <<
MathFuncs::MyMathFuncs::Subtract(a, b) << endl;
cout << "a * b = " <<
MathFuncs::MyMathFuncs::Multiply(a, b) << endl;
cout << "a / b = " <<
MathFuncs::MyMathFuncs::Divide(a, b) << endl;
try
{
cout << "a / 0 = " <<
MathFuncs::MyMathFuncs::Divide(a, 0) << endl;
}
catch (const invalid_argument &e)
{
cout << "Caught exception: " << e.what() << endl;
}
}
catch (...){
cout << "Problem when loading dll file" << endl;
}
system("pause");
return 0;
}
PS.:
Я тоже пробовал без функции LoadLibrary()
.
Что-то, что я тоже пробовал: -> Добавил в проект файлы .lib, .h, .dll;
-> Добавлены файлы .lib, .h, .dll в ту же папку, что и в папке консольного приложения;
-> Добавлены файлы .lib, .h, .dll в ссылки проекта (общие параметры C ++).
Что я думаю: MathFuncsDLL.h читается компилятором, как только он находит функции / классы, когда я пишу код основной программы.
Проблемы, которые у меня остались до сих пор:
[Ошибка ilink32] Ошибка: неразрешенный внешний 'MathFuncs :: MyMathFuncs :: Add (double, double)', на который имеется ссылка в C: \ USERS \ MAURO \ DESKTOP \ PROJETO \ WIN32 \ DEBUG \ FILE1.OBJ
[Ошибка ilink32] Ошибка: неразрешенный внешний объект «MathFuncs :: MyMathFuncs :: Subtract (double, double)», указанный в C: \ USERS \ MAURO \ DESKTOP \ PROJETO \ WIN32 \ DEBUG \ FILE1.OBJ
[Ошибка ilink32] Ошибка: неразрешенный внешний объект «MathFuncs :: MyMathFuncs :: Multiply (double, double)», указанный в C: \ USERS \ MAURO \ DESKTOP \ PROJETO \ WIN32 \ DEBUG \ FILE1.OBJ
[Ошибка ilink32] Ошибка: неразрешенный внешний 'MathFuncs :: MyMathFuncs :: Divide (double, double)', на который имеется ссылка в C: \ USERS \ MAURO \ DESKTOP \ PROJETO \ WIN32 \ DEBUG \ FILE1.OBJ
Подробная информация о компиляторе: -> C ++ Builder XE7.
С этого момента большое спасибо.