Compiling libgd on WinXP/MinGW/MSYS

[email protected] ("JA Robson")
Newsgroups php.gd.devel
Message-ID <[email protected]>
I have a WinXP machine running MinGW/MSYS, and I was having a tough
time getting libgd to compile. The message "symbol lacks external
linkage" kept popping up. I did some poking around on the Internet and
found that it had something do with the 'dllimport' attribute on
function calls.

http://www.google.com/search?ie=UTF-8&oe=utf-8&q=%22symbol+lacks+external+linkage%22&qt_s=Search&sa=N&tab=gw

I eventually landed here --

http://www.phpman.info/index.php/info/gcc

-- and after some tinkering, made a little hack that worked to get it
to compile. I can't really explain why it works (my notion of vtables
and system handling of library function export/imports is hazy, I'm
afraid), but I thought it might be useful to note for users building
libgd with this particular config. Also, I thought the maintainers may
have a clearer idea about what's going on, and provide a better hack
to accommodate the MinGW environments.

My hack was as follows:

----- Makefile:
DEFS = -DHAVE_CONFIG_H -DMINGW


----- gd.h:
#ifdef MINGW       // Declare macros this way...

#define BGD_DECLARE(rt) __declspec(dllexport) rt __stdcall
#define BGD_EXPORT_DATA_PROT __declspec(dllexport) extern
#define BGD_EXPORT_DATA_IMPL __declspec(dllexport)

#else       // If not MINGW, then do defines the  original way

#ifdef NONDLL
#define BGD_DECLARE(rt) extern rt
#else
#ifdef BGDWIN32
#define BGD_DECLARE(rt) __declspec(dllexport) rt __stdcall
#else
#define BGD_DECLARE(rt) __declspec(dllimport) rt _stdcall
#endif // BGDWIN32
#endif // NONDLL

/* 2.0.20: for actual storage of exported data, functions don't need this,
  currently needed only for font pointers */
#ifdef NONDLL
// 2.0.25: bring back extern
#define BGD_EXPORT_DATA_PROT extern
#define BGD_EXPORT_DATA_IMPL
#else
#ifdef BGDWIN32
#define BGD_EXPORT_DATA_PROT __declspec(dllexport) extern
#define BGD_EXPORT_DATA_IMPL __declspec(dllexport)
#else
#define BGD_EXPORT_DATA_PROT __declspec(dllimport) extern
#define BGD_EXPORT_DATA_IMPL __declspec(dllimport)
#endif // BGDWIN32
#endif // NONDLL

#endif // MINGW


Cheers, JA
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.