Дело в том, что вы смешиваете C и C ++ концепции. Даже если 2 nd был построен поверх 1 st , у них очень разные способы решения этой ситуации. Я собираюсь фикус на C ++ .
Однако, независимо от того, какой подход должен быть выбран, в коде есть некоторые ошибки:
- MyClass определение появляется дважды и отличается (также - личное замечание - я нахожу имена, которые начинаются с " My ", чесать мозг)
- Класс не экспортируется
dll00 .h :
#pragma once
#if defined(_WIN32)
# if defined(DLL00_EXPORTS)
# define DLL00_EXPORT_API __declspec(dllexport)
# else
# define DLL00_EXPORT_API __declspec(dllimport)
# endif
#else
# define DLL00_EXPORT_API
#endif
class DLL00_EXPORT_API BaseClass {
public:
virtual void setX(int x) = 0; // Pure virtual
// Some other method declarations might go here. Their implementation should be in dll00.cpp
};
DLL00_EXPORT_API void callSetX(BaseClass *pClass, int value);
dll00. cpp:
#define DLL00_EXPORTS
#include "dll00.h"
#include <iostream>
using std::cout;
void callSetX(BaseClass *pClass, int value) {
if (!pClass) {
cout << "NULL pointer!\n";
return;
}
cout << "Setting x\n";
pClass->setX(value);
}
main. cpp:
#include "dll00.h"
#include <iostream>
using std::cout;
class DerivedClass : public BaseClass {
public:
void setX(int x) override;
private:
int x;
};
void DerivedClass::setX(int x) {
std::cout << "setX(" << x << ")\n";
this->x = x;
}
int main() {
DerivedClass *pInst = new DerivedClass;
callSetX(pInst, 255);
return 0;
}
Вывод :
[cfati@CFATI-5510-0:e:\Work\Dev\StackOverflow\q061152778]> sopr.bat
*** Set shorter prompt to better fit when pasted in StackOverflow (or other) pages ***
[prompt]> "c:\Install\pc032\Microsoft\VisualStudioCommunity\2017\VC\Auxiliary\Build\vcvarsall.bat" x64
**********************************************************************
** Visual Studio 2017 Developer Command Prompt v15.9.21
** Copyright (c) 2017 Microsoft Corporation
**********************************************************************
[vcvarsall.bat] Environment initialized for: 'x64'
[prompt]> dir /b
dll00.cpp
dll00.h
main.cpp
[prompt]> cl /nologo /MD /DDLL /EHsc dll00.cpp /link /NOLOGO /DLL /OUT:dll00.dll
dll00.cpp
Creating library dll00.lib and object dll00.exp
[prompt]> cl /nologo /MD /EHsc main.cpp /link /NOLOGO /OUT:main.exe dll00.lib
main.cpp
Creating library main.lib and object main.exp
[prompt]> dir /b
dll00.cpp
dll00.dll
dll00.exp
dll00.h
dll00.lib
dll00.obj
main.cpp
main.exe
main.exp
main.lib
main.obj
[prompt]> main.exe
Setting x
setX(255)
Более подробную информацию об экспорте файлов из .dll s вы можете проверить [SO]: ошибка компоновщика при вызове функции C из кода C ++ в другом проекте VS2010 (ответ @ CristiFati) .
Примечание : включено Nix , я часто видел такое поведение (в C): .so ссылки на символы, определенные в исполняемом файле, который загружает его (один из таких примеров - stati c Python (где ядро находится в исполняемом файле ), и на символы ссылаются модули расширения ), но на Win (по крайней мере VStudio компилятор) это невозможно.