Problem using libharu library
CodeGuru Home VC++ / MFC / C++ .NET / C# Visual Basic VB Forums Developer.com
Results 1 to 3 of 3

Thread: Problem using libharu library

  1. #1
    Join Date
    Jul 2009
    Posts
    8

    Problem using libharu library

    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:

    Code:
    /*
     * << Haru Free PDF Library 2.0.0 >> -- font_demo.c
     *
     * Copyright (c) 1999-2006 Takeshi Kanno <takeshi_kanno@est.hi-ho.ne.jp>
     *
     * Permission to use, copy, modify, distribute and sell this software
     * and its documentation for any purpose is hereby granted without fee,
     * provided that the above copyright notice appear in all copies and
     * that both that copyright notice and this permission notice appear
     * in supporting documentation.
     * It is provided "as is" without express or implied warranty.
     *
     */
    
    #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
    Code:
    #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
    Code:
    #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


    Muchas gracias por la ayuda!!!!

  2. #2
    Join Date
    Jan 2004
    Location
    Düsseldorf, Germany
    Posts
    2,401

    Re: Problem using libharu library

    You define the function (including function body) error_handler in PDF.h which is included by multiple of your files, thus the linker finds multiple definitions of the functions when trying to link your object files together.

    Instead, just declare the function in the header file (no function body) and define it in PDF.cpp.

    Likewise with env. Declare as extern in the header file and define in the cpp file.
    More computing sins are committed in the name of efficiency (without necessarily achieving it) than for any other single reason - including blind stupidity. --W.A.Wulf

    Premature optimization is the root of all evil --Donald E. Knuth


    Please read Information on posting before posting, especially the info on using [code] tags.

  3. #3
    Join Date
    Jul 2009
    Posts
    8

    Re: Problem using libharu library

    Thank you very much, i have solved the problem as you said and now it works. But i have a new problem, i have substituyed the env by an exception management but when i throw the exception i get a uncontrolled exception... To solve it, i have created a function error, but i think that is not very elegant... jejej. I post the code changed: (the alternative funcion error is commented, i only use the try catch in the sentence where exception is produced...)

    PDF.h
    Code:
    #ifndef _PDF_H_
    #define _PDF_H_
    
    #include <iostream>
    #include <exception>
    #include <string.h>
    #include <setjmp.h>
    #include "hpdf.h"
    #include "ControladorDomini.h"
    
    using namespace std;
    
    class ControladorDomini;
    
    class PDF{
    private:
    	//atributs
    	ControladorDomini* _cd;
    public:
    	//operacions
    	PDF();
    	PDF(ControladorDomini* cd);
    	~PDF();
    	int prova();
    	static void error(int numError);
    };
    
    #endif
    PDF.cpp
    Code:
    #include "PDF.h"
    
    #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);
    	//exception way
    	throw exception();
    	//alternative way
    	/*char buffer[256];
    	string s=itoa(error_no,buffer,16);
    	int error=atoi(s.c_str());
    	PDF::error(error);*/
    }
    
    
    PDF::PDF(){
    
    }
    
    PDF::PDF(ControladorDomini* cd) : _cd(cd){
    }
    
    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);
    
    	//THIS SENTENCE PRODUCE THE EXCEPTION
    	try{
    		HPDF_SaveToFile (pdf, fname);
    	}catch(exception& e){
    		cout<<"la topo"<<endl;
    		HPDF_Free(pdf);
    		return 1;
    	}
    
        /* clean up */
        HPDF_Free (pdf);
    
        return 0;
    }
    
    void PDF::error(int numError){
    	cout<<"la vaca que rie "<<numError<<endl;
    }
    When uncontrolled exception is produced the VS stops at this line of crtexe.c file:
    Code:
    #ifdef WPRFLAG
                __winitenv = envp;
                mainret = wmain(argc, argv, envp);
    #else  /* WPRFLAG */
                __initenv = envp;
                mainret = main(argc, argv, envp);<------------THIS LINE STOPS

Tags for this Thread

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts
  •  


Windows Mobile Development Center


Click Here to Expand Forum to Full Width

This is a CodeGuru survey question.


Featured


HTML5 Development Center