Naja vllt wäre es auch ganz gut mal den Header einzubinden, in dem die Deklaration der Klasse ist ... nur vllt fällt dir dann auf, dass das ein wenig doof ist, weil da ja noch steht, dass die Klasse exportiert werden soll! Dafür gibt es dann so tolle Makros, die dann, wenn du die Headerdatei einbindest und nicht sagst, dass bei dem Build alles exportiert werden soll, alles importiert werden soll!!!
|
C-/C++-Quelltext
|
1
2
3
4
5
|
#ifdef FOO_EXPORTS
#define FOO_API __declspec(dllexport)
#else // !FOO_EXPORTS
#define FOO_API __declspec(dllimport)
#endif // FOO_EXPORTS
|
soo sieht das Makro aus ... ehm kannst natürlich auch andere Namen nehmen. Auf jedenfall gehst du jetzt hin und weißt beim Builden darauf hin, dass FOO_EXPORTS definiert sein soll (in der DLL) und wenn du den Header dann nachher wieder "inkludierst", darf FOO_EXPORTS natürlich nicht definiert sein.
Am einfachsten legst du für die DLL einen gemeinsamen Header ein, der alle anderen Header einbindet.
foo.hpp (FOO_EXPORTS
definiert!)
|
C-/C++-Quelltext
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
#if !defined(FOO_HPP__INCLUDED)
#define FOO_HPP__INCLUDED
#if (_MSC_VER >= 1300)
#pragma once
#endif // (_MSC_VER >= 1300)
// Export Makro
#ifdef FOO_EXPORTS
#define FOO_API __declspec(dllexport)
#else // !FOO_EXPORTS
#define FOO_API __declspec(dllimport)
#endif // FOO_EXPORTS
// DLL-Headers
#include "print_int.hpp"
#endif // FOO_HPP__INCLUDED
|
print_int.hpp
|
C-/C++-Quelltext
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
|
#if !defined(PRINT_INT_HPP__INCLUDED)
#define PRINT_INT_HPP__INCLUDED
#if (_MSC_VER >= 1300)
#pragma once
#endif // (_MSC_VER >= 1300)
#include <iostream>
struct FOO_API print_int
{
int data;
print_int(int const& data)
: data(data)
{}
friend std::ostream& operator<<(std::ostream& out, print_int const& data)
{ out << data.data; }
};
#endif // MY_CLASS_HPP__INCLUDED
|
Wenn print_int jetzt im Sourcefile die Implementierung hätte, würdest du dort ausschließlich foo.h einbinden, nicht print_int.h!
Genutzt dann einfach (FOO_EXPORTS
nicht definiert!):
|
C-/C++-Quelltext
|
1
2
3
4
5
6
7
|
#include <foo.h>
#include <iostream>
int main()
{
std::cout << print_int(10) << std::endl;
}
|
.
So das sollte reichen ...