2011年7月20日水曜日

ATTACH_PARENT_PROCESS



このような問題がありました:
CC     main.o
main.c:47:2: error: #error "_WIN32_WINNT must be defined >= 0x0500"
main.c: In function 'main':
main.c:252:52: error: 'ATTACH_PARENT_PROCESS' undeclared (first use in this function)
main.c:252:52: note: each undeclared identifier is reported only once for each function it appears in
make[3]: *** [main.o] Error 1
このような事が考えられます:

ATTACH_PARENT_PROCESSを引数として受け付けるAPI AttachConsole Function は,Windows XP以上のOSで実装されている様に示されています。
Windows XPは,Version 5.1のOSですので,こちらのOS向け機能がビルド時に利用できるように,プリプロセッサ_WIN32_WINNT=0x0501を定義する必要があるものと考えられます。

AttachConsole APIは(glib等が出力する)デバッグ出力を,evince等の様な黒窓(コンソールウィンドウ)を持たないプログラムに対しても黒窓を出現させて,デバッグ出力を可視化できるといった効能があり,活用されているようです。
このように対策しました:
  • #include "config.h"の後に、
    #define _WIN32_WINNT 0x0501
    を追加してみる。

_imp__xmlFree

問題:
Creating library file: .libs/libpdfdocument.dll.a
.libs/ev-poppler.o: In function `pdf_document_get_format_from_metadata':
C:\msys\1.0\home\KU\evince-2.32.0\backend\pdf/ev-poppler.cc:477: undefined reference to `_imp__xmlFree'
対策:
  • backend/pdf/ev-poppler.ccに次の行を足す:
    #define IN_LIBXML
対策2:
  • config.hに次の行を足す:
    #define IN_LIBXML
対策3:

cannot find -lxml2

問題:
C:\MinGW\bin/ld.exe: cannot find -lxml2
collect2: ld returned 1 exit status
対策:
export LD_LIBRARY_PATH=/mingw/lib
対策2:
  • libxml2.lib→libxml2.a

glib-compile-schemas.exe


このような問題がありました:
GEN    org.gnome.Evince.gschema.valid
/bin/sh: C:/MinGW/bin/glib-compile-schemas.exe: No such file or directory

このようなことが考えられます:

Win32版GLib 2.28.1のRun-time及びDevパッケージには,evinceのビルドに必要となるプログラムglib-compile-schemas.exeが含まれて居なかったようです。
evinceのビルドを通すためには,自力でGLibをソースコードからビルドし、glib-compile-schemas.exeを作成する必要があるものと考えられます。

このように対策しました:
KU@DD5 ~/glib-2.28.1
$ ./configure --prefix=/mingw
$ make
$ make install

poppler_page_get_text


このような問題がありました:
CXX    ev-poppler.lo
ev-poppler.cc: In function 'gchar* pdf_selection_get_selected_text(EvSelection*, EvPage*, EvSelectionStyle, EvRectangle*)':
ev-poppler.cc:1939:8: error: too many arguments to function 'char* poppler_page_get_text(PopplerPage*)'
C:/MinGW/include/poppler/glib/poppler-page.h:101:24: note: declared here
このようなことが考えられます:

詳しくは,こちらのgit commitをご覧ください。
poppler 0.14.0から0.15.0へバージョンアップがなされた際に,poppler_page_get_text手続き関数のプロトタイプが変更されてしまいました。
0.14.0の頃のpoppler_page_get_textに相当するものは,0.15.0ではpoppler_page_get_selected_textに置き換えられました。
0.15.0以遠のpoppler_page_get_textは仕様が変更され,プロトタイプが簡素化されましたので,別物になっています。
これにより,以前はビルドが通っていたものも,ビルドが通らなくなったものと考えられます。

このように対策しました:
  • poppler_page_get_selected_textに置き換え.

XML::Parser perl module is required for intltool

このような問題がありました:
checking for XML::Parser... configure: error: XML::Parser perl module is required for intltool
このようなことが考えられます:
MSYS-EXPAT-1.DLLが不足しているようです。
このように対策しました:
MSYS-EXPAT-1.DLLを工面いたします。
通常は、C:\MinGW\binにMSYS-EXPAT-1.DLLを配置すれば良いでしょう。
入手は、こちらから。

No package 'libxml-2.0' found

問題:
checking for SHELL_CORE... configure: error: Package requirements (libxml-2.0 >= 2.5.0 gtk+-2.0 >= 2.21.5 gio-2.0 >= 2.25.11 gthread-2.0 ) were not met:

No package 'libxml-2.0' found

Consider adjusting the PKG_CONFIG_PATH environment variable if you
installed software in a non-standard prefix.

Alternatively, you may set the environment variables SHELL_CORE_CFLAGS
and SHELL_CORE_LIBS to avoid the need to call pkg-config.
See the pkg-config man page for more details.
対策:
export PKG_CONFIG_PATH=/mingw/lib/pkgconfig/
libxml-2.0.pcを作出する:
prefix=/mingw
exec_prefix=${prefix}
libdir=${exec_prefix}/lib
includedir=${prefix}/include

Name: libXML
Version: 2.7.8
Description: libXML library version2.
Requires:
Libs: -L${libdir} -lxml2
Libs.private: -L${libdir} -llibxml2
Cflags: -I${includedir}/libxml

Can't locate strict.pm in @INC

このような問題がありました:
checking for intltool >= 0.35.0... Can't locate strict.pm in @INC (@INC contains: /usr/lib/perl5/5.8/msys /usr/lib/perl5/5.8 /usr/lib/perl5/site_perl/5.8/msys /usr/lib/perl5/site_perl/5.8 /usr/lib/perl5/site_perl/5.8 /usr/lib/perl5/vendor_perl/5.8/msys /usr/lib/perl5/vendor_perl/5.8 /usr/lib/perl5/vendor_perl/5.8 .) at /mingw/bin/intltool-update line 37.BEGIN failed--compilation aborted at /mingw/bin/intltool-update line 37.foundconfigure: error: Your intltool is too old. You need intltool 0.35.0 or later.
このようなことが考えられます:
intltoolが導入されている環境であっても,intltoolが検出されない場合があります。
それは,intltoolの実行環境であるperlの設定が不適切なため,intltoolの存在が正しく識別されていないことが考えられます。
このように対策しました:
export PERL5LIB=/mingw/lib/perl5/5.8/msys:/mingw/lib/perl5/5.8:/mingw/lib/perl5/site_perl/5.8/msys:/mingw/lib/perl5/site_perl/5.8:/mingw/lib/perl5/vendor_perl/5.8/msys:/mingw/lib/perl5/vendor_perl/5.8

intltool

このような問題がありました:
checking for intltool >= 0.35.0... ./configure: /mingw/bin/intltool-update: /opt/perl/bin/perl: bad interpreter: No such file or directory
found
configure: error: Your intltool is too old. You need intltool 0.35.0 or later.
このようなことが考えられます:
ご利用の環境に/opt/perl/bin/perlが存在しないようです。
このように対策しました:
MinGW環境:
mkdir -p /opt/perl/bin
ln `which perl` /opt/perl/bin/perl
うまくいかない場合:
Perlが入っていないと,成功しません。
perl-5.8.8-1-msys-1.0.17-bin.tar.lzmaを入手して導入する必要がありそうです。入手は,こちらから。

struct in_addr

このような問題がありました:
In file included from ./include/wsockcompat.h:12:0,
                 from nanohttp.c:84:
c:\mingw\bin\../lib/gcc/mingw32/4.5.2/../../../../include/winsock2.h:223:8: error: redefinition of 'struct in_addr'
c:\mingw\bin\../lib/gcc/mingw32/4.5.2/../../../../include/cygwin/in.h:81:8: note: originally defined here
c:\mingw\bin\../lib/gcc/mingw32/4.5.2/../../../../include/winsock2.h:254:8: error: redefinition of 'struct sockaddr_in'
c:\mingw\bin\../lib/gcc/mingw32/4.5.2/../../../../include/cygwin/in.h:96:8: note: originally defined here

このようなことが考えられます:

MinGWでは本来,(Cygwin由来と考えられる)cygwin/in.hは含まれないはずのものですので,cygwin/in.hを取り除くことが必要と考えられます。

このように対処しました:
  • cygwin/in.hを無くする。
  • 再configureする。

poll


このような問題がありました:
Creating library file: .libs/libxml2.dll.a
.libs/nanohttp.o: In function `xmlNanoHTTPRecv':
C:\msys\1.0\home\KU\libxml2-2.7.8/nanohttp.c:596: undefined reference to `poll'
このようなことが考えられます:

MinGWでは本来,(Cygwin由来と考えられる)poll.hは含まれないはずのものですので,poll.hを取り除くことが必要と考えられます。

このように対処しました:
  • poll.hを無くする。
  • 再configureする。

struct hostent


このような問題がありました:
In file included from ./include/wsockcompat.h:12:0,
                 from nanohttp.c:84:
c:\mingw\bin\../lib/gcc/mingw32/4.5.2/../../../../include/winsock2.h:120:9: error: redefinition of 'struct hostent'
c:\mingw\bin\../lib/gcc/mingw32/4.5.2/../../../../include/netdb.h:73:8: note: originally defined here
c:\mingw\bin\../lib/gcc/mingw32/4.5.2/../../../../include/winsock2.h:155:8: error: redefinition of 'struct netent'
c:\mingw\bin\../lib/gcc/mingw32/4.5.2/../../../../include/netdb.h:87:8: note: originally defined here
c:\mingw\bin\../lib/gcc/mingw32/4.5.2/../../../../include/winsock2.h:161:9: error: redefinition of 'struct servent'
c:\mingw\bin\../lib/gcc/mingw32/4.5.2/../../../../include/netdb.h:94:8: note: originally defined here

このようなことが考えられます:

MinGWでは本来,(Cygwin由来と考えられる)netdb.hは含まれないはずのものですので,netdb.hを取り除くことが必要と考えられます。

このように対処しました:
  • netdb.hを無くする。
  • 再configureする。

libtoolT

問題:
/bin/rm: cannot lstat `libtoolT': No such file or directory
対処*1:
  • configure.in を修正します.
■修正前
AC_PATH_PROG(RM, rm, /bin/rm)
AC_PATH_PROG(MV, mv, /bin/mv)
■修正後
AC_PATH_PROG(RM, rm, /bin/rm)
RM="$RM -f"
AC_PATH_PROG(MV, mv, /bin/mv)
  • 後、autoconfも忘れずに。

*1 http://oku.edu.mie-u.ac.jp/~okumura/texwiki/?Texmaker

redefinition of 'struct timeval'

問題:
CXX    GooTimer.lo
In file included from c:\mingw\bin\../lib/gcc/mingw32/4.5.2/../../../../include/windows.h:98:0,
                 from GooTimer.h:27,
                 from GooTimer.cc:20:
c:\mingw\bin\../lib/gcc/mingw32/4.5.2/../../../../include/winsock2.h:103:2: warning: #warning "fd_set and associated macros have been defined in sys/types.
 This may cause runtime problems with W32 sockets"
c:\mingw\bin\../lib/gcc/mingw32/4.5.2/../../../../include/winsock2.h:109:8: error: redefinition of 'struct timeval'
c:\mingw\bin\../lib/gcc/mingw32/4.5.2/../../../../include/sys/time.h:16:16: error: previous definition of 'struct timeval'
make[2]: *** [GooTimer.lo] Error 1
対策:
  • mingwrt-3.18-mingw32-dev.tar.gz上書きで直ったかもしれない。

INT32


問題:
CXX    JpegWriter.lo
In file included from c:\mingw\bin\../lib/gcc/mingw32/4.5.2/../../../../include/winnt.h:192:0,
                 from c:\mingw\bin\../lib/gcc/mingw32/4.5.2/../../../../include/windef.h:253,
                 from ../poppler/poppler-config.h:84,
                 from ../poppler/Error.h:33,
                 from JpegWriter.cc:17:
c:\mingw\bin\../lib/gcc/mingw32/4.5.2/../../../../include/basetsd.h:54:13: error: conflicting declaration 'typedef int INT32'
c:\mingw\bin\../lib/gcc/mingw32/4.5.2/../../../../include/jmorecfg.h:165:14: error: 'INT32' has a previous declaration as 'typedef long int INT32'
make[2]: *** [JpegWriter.lo] Error 1
対策:
  • JpegWriter.hで、basetsd.hへの参照を挟む。
    #include <sys/types.h>
    #include <basetsd.h>

select

問題:
CC     gbacktrace.lo
In file included from gbacktrace.c:57:0:
c:\mingw\bin\../lib/gcc/mingw32/4.5.2/../../../../include/sys/select.h:28:12: error: expected declaration specifiers or '...' before 'fd_set'
c:\mingw\bin\../lib/gcc/mingw32/4.5.2/../../../../include/sys/select.h:28:12: error: expected declaration specifiers or '...' before 'fd_set'
c:\mingw\bin\../lib/gcc/mingw32/4.5.2/../../../../include/sys/select.h:28:12: error: expected declaration specifiers or '...' before 'fd_set'
In file included from c:\mingw\bin\../lib/gcc/mingw32/4.5.2/../../../../include/windows.h:98:0,
                 from gbacktrace.c:65:
c:\mingw\bin\../lib/gcc/mingw32/4.5.2/../../../../include/winsock2.h:632:32: error: conflicting types for 'select'
c:\mingw\bin\../lib/gcc/mingw32/4.5.2/../../../../include/sys/select.h:28:5: note: previous declaration of 'select' was here
make[4]: *** [gbacktrace.lo] Error 1
考察:
  • cygwinのsys/select.hが混入していると考えられます。
対策:
C:\MinGW\include\sys>ren select.h *.bak
後、configureし直しも必要。

clock_t

問題:
CC     gbacktrace.lo
In file included from gbacktrace.c:44:0:
c:\mingw\bin\../lib/gcc/mingw32/4.5.2/../../../../include/sys/times.h:11:19: error: conflicting types for 'clock_t'
c:\mingw\bin\../lib/gcc/mingw32/4.5.2/../../../../include/time.h:71:14: note: previous declaration of 'clock_t' was here
考察:
  • cygwinのsys/times.hが混入していると考えられます。
対策:
C:\MinGW\include\sys>ren times.h *.bak
後、configureし直しも必要。

_impure_ptr

問題:
CCLD   libjpeg.la
Creating library file: .libs/libjpeg.dll.a
.libs/jerror.o: In function `output_message':
C:\msys\1.0\home\KU\jpeg-8c/jerror.c:111: undefined reference to `_impure_ptr'
collect2: ld returned 1 exit status
考察:
  • C:\MinGW\include\stdio.h
    #define stderr (_impure_ptr->_stderr)
  • cygwinのstdio.hが混入したことによるエラー発生の可能性が高いです。
対策:
  • mingwrt-3.18-mingw32-dev.tar.gzで上書きする。

jpeg_suppress_tables

問題:
CC     jcapimin.lo
jcapimin.c:127:1: error: conflicting types for 'jpeg_suppress_tables'
jcapimin.c:128:1: note: an argument type that has a default promotion can't match an empty parameter name list declaration
jpeglib.h:984:14: note: previous declaration of 'jpeg_suppress_tables' was here
考察:
  • autoheaderを使うと出なくなりました。詳しくはこちらの記事をご覧ください。

  • jconfig.h中の、これがダメ
    #undef HAVE_PROTOTYPES
  • configureのバグか、jconfig.cfgのバグか、折角configureして出来たconfdefs.hの内容が反映されないのが原因かなと考えられます。
  • autoconfを使ってconfigureを作り直したら出なくなりました。但し、作り直す方法にクセが有ります。
    詳しくは
    こちらの記事をご覧ください。
対策:
  • configureの前に、autoheaderを実行します。

  • config.logのケツの方に在るconfdefs.hとやらの定義を自分で、自動生成された後のjconfig.hの後ろに貼り付けてあげる。
## ----------- ##
## confdefs.h. ##
## ----------- ##

/* confdefs.h */
//#define PACKAGE_NAME "libjpeg"
//#define PACKAGE_TARNAME "libjpeg"
//#define PACKAGE_VERSION "8.3.0"
//#define PACKAGE_STRING "libjpeg 8.3.0"
//#define PACKAGE_BUGREPORT ""
//#define PACKAGE_URL ""
//#define PACKAGE "libjpeg"
//#define VERSION "8.3.0"
#define PROTOTYPES 1
#define __PROTOTYPES 1
#define HAVE_SYS_TYPES_H 1
#define HAVE_SYS_STAT_H 1
#define HAVE_STDLIB_H 1
#define HAVE_STRING_H 1
#define HAVE_MEMORY_H 1
#define HAVE_STRINGS_H 1
#define HAVE_UNISTD_H 1
#define HAVE_STRING_H 1
#define HAVE_PROTOTYPES 1
#define HAVE_STDDEF_H 1
#define HAVE_STDLIB_H 1
#define HAVE_LOCALE_H 1
#define HAVE_UNSIGNED_CHAR 1
#define HAVE_UNSIGNED_SHORT 1
#define INLINE __inline__
#define HAVE_DLFCN_H 1
#define LT_OBJDIR ".libs/"
  • PACKAGE_NAME等の定義は外しておく。他のパッケージと混ぜる時に問題となるので。

古いAcrobatをご利用の方のために…

「何ゆえActiveXでEvinceを動くようにする必要が有るのか」

という疑問が有るかも知れません。

Adobe Readerという、年々進化し続ける高機能なPDF Viewerが有るにも関わらず…

理由は、
  • 古いAcrobatをご利用のお客様がいらっしゃるため。
  • 作ってみたかった/やってみたかった。
です。

2011年7月19日火曜日

evince-previewerをActiveX対応へ

evince-2.32のevince-previewerを改造し、何とかActiveXに対応してみました。

これにより、Internet Explorerにホストする事が可能になっています:

Internet Explorerにホストされたevince-previewer

成果品は今しばらく、非公開とさせて頂きます。動作が不安定なためです。

2011年7月8日金曜日

始めます

Evinceという、ドキュメントビューア機能を実現するソフトが有ります。

Linuxで動きます。Ubuntuで動作を確かめました。良い感じです。

最近はWindowsでも動くようになりました。

Internet Explorerの中で動くと更に都合が良いです。

当ブログの目指すべき所は、このソフトをInternet Explorerの中で動作するように改良しよう、です。

実現する為に取った方法等を都度発信し、情報発信の場としていきたいと思います。