Problem linking libraries in VS2008

Hello,

I'm developing a program in c++ with visual studio 2008 to acces to a data base and make pdf documents with the information. For this, i have chosen to use c++ with mysql-connector-c++ to acces to data base. I use the static library and it works perfect, and giving more information i had to change some properties:

(1)- Linker - General: Add the lib directory to "Aditional library directories"
(2)- Linker - Entrance/Input: Add files 'mysqlcppcon-static.lib' and 'libmysql.lib' to Aditional dependences.
(3)- C++ - General: Add include directory to "Aditional include directory"
(4)- C++ - Preprocessor: WIN32;NDEBUG;_CONSOLE;CPPCONN_PUBLIC_FUNC=

Then i, start with libharu library to create the pdf. First of all, i have tried to run an example of libharu page. I configurate the lib directory, the additional dependences and the include directory. It works perfect. The code used is:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <setjmp.h>
#include "hpdf.h"

jmp_buf env;

#ifdef HPDF_DLL
void  __stdcall
#else
void
#endif
error_handler (HPDF_STATUS   error_no,
               HPDF_STATUS   detail_no,
               void         *user_data)
{
    printf ("ERROR: error_no=%04X, detail_no=%u\n", (HPDF_UINT)error_no,
                (HPDF_UINT)detail_no);
    longjmp(env, 1);
}

const char *font_list[] = {
    "Courier",
    "Courier-Bold",
    "Courier-Oblique",
    "Courier-BoldOblique",
    "Helvetica",
    "Helvetica-Bold",
    "Helvetica-Oblique",
    "Helvetica-BoldOblique",
    "Times-Roman",
    "Times-Bold",
    "Times-Italic",
    "Times-BoldItalic",
    "Symbol",
    "ZapfDingbats",
    NULL
};

int main (int argc, char **argv)
{
    const char *page_title = "Font Demo";
    HPDF_Doc  pdf;
    char fname[256];
    HPDF_Page page;
    HPDF_Font def_font;
    HPDF_REAL tw;
    HPDF_REAL height;
    HPDF_REAL width;
    HPDF_UINT i;

    strcpy (fname, argv[0]);
    strcat (fname, ".pdf");

    pdf = HPDF_New (error_handler, NULL);
    if (!pdf) {
        printf ("error: cannot create PdfDoc object\n");
        return 1;
    }

    if (setjmp(env)) {
        HPDF_Free (pdf);
        return 1;
    }

    /* Add a new page object. */
    page = HPDF_AddPage (pdf);

    height = HPDF_Page_GetHeight (page);
    width = HPDF_Page_GetWidth (page);

    /* Print the lines of the page. */
    HPDF_Page_SetLineWidth (page, 1);
    HPDF_Page_Rectangle (page, 50, 50, width - 100, height - 110);
    HPDF_Page_Stroke (page);

    /* Print the title of the page (with positioning center). */
    def_font = HPDF_GetFont (pdf, "Helvetica", NULL);
    HPDF_Page_SetFontAndSize (page, def_font, 24);

    tw = HPDF_Page_TextWidth (page, page_title);
    HPDF_Page_BeginText (page);
    HPDF_Page_TextOut (page, (width - tw) / 2, height - 50, page_title);
    HPDF_Page_EndText (page);

    /* output subtitle. */
    HPDF_Page_BeginText (page);
    HPDF_Page_SetFontAndSize (page, def_font, 16);
    HPDF_Page_TextOut (page, 60, height - 80, "<Standerd Type1 fonts samples>");
    HPDF_Page_EndText (page);

    HPDF_Page_BeginText (page);
    HPDF_Page_MoveTextPos (page, 60, height - 105);

    i = 0;
    while (font_list[i]) {
        const char* samp_text = "abcdefgABCDEFG12345!#$%&+-@?";
        HPDF_Font font = HPDF_GetFont (pdf, font_list[i], NULL);

        /* print a label of text */
        HPDF_Page_SetFontAndSize (page, def_font, 9);
        HPDF_Page_ShowText (page, font_list[i]);
        HPDF_Page_MoveTextPos (page, 0, -18);

        /* print a sample text. */
        HPDF_Page_SetFontAndSize (page, font, 20);
        HPDF_Page_ShowText (page, samp_text);
        HPDF_Page_MoveTextPos (page, 0, -20);

        i++;
    }

    HPDF_Page_EndText (page);

    HPDF_SaveToFile (pdf, fname);

    /* clean up */
    HPDF_Free (pdf);

    return 0;
}


As it works perfect, i tried to introduce this test to my development program. Then i create a class to generate the pdf's and i tried to run the example as first objective. Then my problems start. I have configured the properties of the solution adapting the steps (1), (2) and (3) with the new directories and files. After that and after to repair all the compilation errors my code is this:

PDF.h
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
#ifndef _PDF_H_
#define _PDF_H_

#include <iostream>
#include <string.h>
#include <setjmp.h>
#include "hpdf.h"

jmp_buf env;

#ifdef HPDF_DLL
	void  __stdcall
#else
void
#endif

error_handler (HPDF_STATUS   error_no,
		 HPDF_STATUS   detail_no,
		 void         *user_data)
{
/* throw exception when an error has occured */
printf ("ERROR: error_no=%04X, detail_no=%d\n", (unsigned int)error_no,     
  (int)detail_no);
longjmp(env, 1);
}

class PDF{
private:
	//atributs

public:
	//operacions
	PDF();
	~PDF();
	int prova();
};

#endif 


PDF.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
#include "PDF.h"

PDF::PDF(){

}

PDF::~PDF(){

}

int PDF::prova(){
	const char *font_list[] = {
		"Courier",
		"Courier-Bold",
		"Courier-Oblique",
		"Courier-BoldOblique",
		"Helvetica",
		"Helvetica-Bold",
		"Helvetica-Oblique",
		"Helvetica-BoldOblique",
		"Times-Roman",
		"Times-Bold",
		"Times-Italic",
		"Times-BoldItalic",
		"Symbol",
		"ZapfDingbats",
		NULL
	};
    const char *page_title = "Font Demo";
    HPDF_Doc  pdf;
    char fname[256];
    HPDF_Page page;
    HPDF_Font def_font;
    HPDF_REAL tw;
    HPDF_REAL height;
    HPDF_REAL width;
    HPDF_UINT i;

    strcpy (fname, "patata");
    strcat (fname, ".pdf");

	pdf = HPDF_New (error_handler, NULL);
    if (!pdf) {
        printf ("error: cannot create PdfDoc object\n");
        return 1;
    }

    /* Add a new page object. */
    page = HPDF_AddPage (pdf);

    height = HPDF_Page_GetHeight (page);
    width = HPDF_Page_GetWidth (page);

    /* Print the lines of the page. */
    HPDF_Page_SetLineWidth (page, 1);
    HPDF_Page_Rectangle (page, 50, 50, width - 100, height - 110);
    HPDF_Page_Stroke (page);

    /* Print the title of the page (with positioning center). */
    def_font = HPDF_GetFont (pdf, "Helvetica", NULL);
    HPDF_Page_SetFontAndSize (page, def_font, 24);

    tw = HPDF_Page_TextWidth (page, page_title);
    HPDF_Page_BeginText (page);
    HPDF_Page_TextOut (page, (width - tw) / 2, height - 50, page_title);
    HPDF_Page_EndText (page);

    /* output subtitle. */
    HPDF_Page_BeginText (page);
    HPDF_Page_SetFontAndSize (page, def_font, 16);
    HPDF_Page_TextOut (page, 60, height - 80, "<Standerd Type1 fonts samples>");
    HPDF_Page_EndText (page);

    HPDF_Page_BeginText (page);
    HPDF_Page_MoveTextPos (page, 60, height - 105);

    i = 0;
    while (font_list[i]) {
        const char* samp_text = "abcdefgABCDEFG12345!#$%&+-@?";
        HPDF_Font font = HPDF_GetFont (pdf, font_list[i], NULL);

        /* print a label of text */
        HPDF_Page_SetFontAndSize (page, def_font, 9);
        HPDF_Page_ShowText (page, font_list[i]);
        HPDF_Page_MoveTextPos (page, 0, -18);

        /* print a sample text. */
        HPDF_Page_SetFontAndSize (page, font, 20);
        HPDF_Page_ShowText (page, samp_text);
        HPDF_Page_MoveTextPos (page, 0, -20);

        i++;
    }

    HPDF_Page_EndText (page);

    HPDF_SaveToFile (pdf, fname);

    /* clean up */
    HPDF_Free (pdf);

    return 0;
}


The problem is that now, i get linking errors... i'm a beginner and i don't understand very well what is happening and how to fix it... I have tried to use libharu dinamic and static library and the problems are the same... The translations of the error's are this:

1>ControladorDades.obj : error LNK2005: already defined "int * env" (?env@@3PAHA) in ControladorConsola.obj
1>ControladorDades.obj : error LNK2005: already defined "void __cdecl error_handler(unsigned long,unsigned long,void *)" (?error_handler@@YAXKKPAX@Z) in ControladorConsola.obj
1>ControladorDomini.obj : error LNK2005: already defined "int * env" (?env@@3PAHA) in ControladorConsola.obj
1>ControladorDomini.obj : error LNK2005: already defined "void __cdecl error_handler(unsigned long,unsigned long,void *)" (?error_handler@@YAXKKPAX@Z) in ControladorConsola.obj
1>PDF.obj : error LNK2005: already defined "int * env" (?env@@3PAHA) in ControladorConsola.obj
1>PDF.obj : error LNK2005: already defined "void __cdecl error_handler(unsigned long,unsigned long,void *)" (?error_handler@@YAXKKPAX@Z) in ControladorConsola.obj
1>D:\VS PROJECT\nucleo\Release\nucleo.exe : fatal error LNK1169: founded one or more symbol defined simultaneously

THAAAAAAAAAAAAAAAAANKS
You've defined env and error_handler in the header file, which is then compiled by the source files. The linker sees the two definitions at stops. You need to declare them in the header file and define them in a source file.

e.g.
1
2
3
4
5
6
7
8
9
10
11
extern jmp_buf env;

#ifdef HPDF_DLL
	void  __stdcall
#else
void
#endif

error_handler (HPDF_STATUS   error_no,
		 HPDF_STATUS   detail_no,
		 void         *user_data);
Topic archived. No new replies allowed.