From: Keith M. <kei...@to...> - 2007-02-23 15:21:42
|
Mark Piffer wrote: > I get the error that the reference to 'setenv' couldn't be > resolved. That's correct. MinGW uses the MSVCRT runtime library, which provides no such function. > A check of all header files reveals that setenv is really not > there, just 'getenv' can be found in stdlib.h. The important criterion isn't what's defined in the headers, but rather what is provided by the runtime library. > I resolved the problem for the moment by commenting the call > to setenv out, Which means your application now isn't behaving as it should, for it is no longer able to modify it's environment. > but I suppose there must be a way to supply MinGW with a > setenv-like functionality It already has it -- it uses the putenv function. > as there are surely several apps out there which really rely > on it (more than Global). IMO, Global is broken. There are two common standard functions for manipulating the environment, viz. setenv and putenv. Some systems provide both, some only setenv, and others, like Woe32, only provide putenv. Any portable application needs to check, via its configure script, to determine which of these APIs is supported, and then deploy the correct one in its code. FWIW, here's a sample from the code for man: static void mysetenv(const char *name, const char *value) { #ifdef HAVE_SETENV setenv(name, value, 1); #else int len = strlen(value)+1+strlen(value)+1; char *str = my_malloc(len); sprintf(str, "%s=%s", name, value); putenv(str); #endif } This relies on the the configure script checking for the availability of the setenv function, and adding an appropriate definition to config.h, when it is present; it unconditionally assumes that putenv will be available, if setenv isn't, which is perhaps an unsafe assumption, but if neither is available the code will simply fail to link anyway. Do also note that the APIs for the two functions are not the same; with putenv we say: putenv( "NAME=VALUE" ); whereas with setenv we have to say: setenv( "NAME", "VALUE", OVERWRITE_OPTION ); HTH, Keith. |