Have you tried to recompile all from clean? Maybe the release lib is corrupted...
On Fri, May 7, 2010 at 15:47, Jean-Denis Muys <jdm...@mac.com> wrote: > I downloaded the source code from the links at > http://logging.apache.org/log4cxx/download.html > I simply compiled it following the instructions at > http://logging.apache.org/log4cxx/building/vstudio.html > > I had no error doing so. > > I tried to track down one of those missing symbols, namely "getLogger(char > const * const)". > I found the implementation LoggerPtr Logger::getLogger(const char* const > name) in the file logger.cpp. Notice the difference between the parameter > signature (char const * const vs const char* const). > It is declared in logger.h in a class that is declared: > class LOG4CXX_EXPORT Logger : ... > > so it is controlled by the LOG4CXX_EXPORT macro that you described. > > I am totally at loss. The source code looks fine. Everything compiles fine > in both mode. The library links fine in both mode. The client code compiles > fine in both modes. The client code links and runs fine in Debug mode, but > fails to link in Release mode. > > I am now trying to rebuild the log4cxx.lib library using the linker verbose > mode in the hope of seeing those symbols in the output somehow. But then, I > don't know what I can do next, whether or not they do show up. > > Jean-Denis. > > > On May 7, 2010, at 15:26 , Fabian Jacquet wrote: > > <venting frustration> > Why my boss don't want I develop for MacOS X ? :-) > </venting frustration> > > The class déclaration must be __declspec(export) when you compile the dll > and must be __declspec(import) when you include .h from this dll. So it's > correct in your error message. > It's possible that the missing symbols declarations didn't have > __declspec(export) when you compiled log4cxx.dll > > Did you take sources from SVN? I compiled the source downloaded from the > web site with VisualStudio 2008 without any problem. > > > On Fri, May 7, 2010 at 14:12, Jean-Denis Muys <jdm...@mac.com> wrote: > >> When setting the linker verbose, it indeed reports that it is searching >> log4cxx.lib. >> When setting fully verbose, it even reports *finding* symbols in >> log4cxx.lib with the file that references them. >> So indeed, the linker finds log4cxx.lib AND manages to find some of the >> symbols I use. >> Also, it seems that all the found symbols have a __thiscall declaration, >> while all the ones that are *not* found have a __stdcall declaration. >> >> I have no idea whether this has any significance. >> >> regarding the __declspec thing, I noticed that the linker says the symbols >> it cannot find are __declspec(import), not __declspec(export). What are the >> differences between these two? Could it be that the "export" variations are >> in the log4cxx.lib file but cannot be matched to the "import" variation it's >> looking for? >> >> <venting frustration> >> Why is the Windows platform so poorly designed? None of those charades are >> necessary on the BSD architecture that MacOS X is built upon! >> </venting frustration> >> >> I am not sure what I can do next. I'll try to look for those symbols in >> the log4cxx source to check their declarations. >> >> Jean-Denis >> >> >> >> On May 7, 2010, at 12:02 , Fabian Jacquet wrote: >> >> Mh, maybe those symbols are in the DLL but not in the lib. To be in the >> lib, it must have __declspec(dllexport) when compiling. >> log4cxx use this define to do this: >> #if defined(LOG4CXX_STATIC) >> #define LOG4CXX_EXPORT >> // definitions used when building DLL >> #elif defined(LOG4CXX) >> #define LOG4CXX_EXPORT __declspec(dllexport) >> #else >> // definitions used when using DLL >> #define LOG4CXX_EXPORT __declspec(dllimport) >> #endif >> >> So, "LOG4CXX_EXPORT __declspec(dllexport)" when compiling log4cxx.dll >> and >> "LOG4CXX_EXPORT __declspec(dllimport)" when including log4cxx.h from your >> project. >> >> If for some reason, LOG4CXX_STATIC is defined, it's possible that some >> symbols are not exported. But I don't know how it's possible. >> >> If you don't use more than those 13 symbols maybe nothing is exported or >> maybe the link don't use log4cxx.lib. >> You can check the list of lib used by the linker like this: >> Project properties>Linker>General>Show Progress = /VERBOSE:LIB >> The linker will dump the lib list in the output window of visual studio >> when compiling. Check that you have something like that: >> 1> Searching [your directories]\log4cxx.lib: >> >> I don't know any tools to check symbols. I think you could check with >> notepad, you can search about "getLogger" by example but if you find it, I >> don't know if you can conclude that the symbol is right exported. If you >> don't find it, I think the problem comes from the lib :-) >> >> On Fri, May 7, 2010 at 11:08, Jean-Denis Muys <jdm...@mac.com> wrote: >> >>> Thanks for answering. I wish the solution was that simple. I apologize >>> for not explicitly mentioning it, but my project is - I think - set up >>> correctly. >>> >>> That is: >>> >>> - both the Debug and Release configurations mention log4cxx.lib in its >>> Linker>Input>Additional Dependencies >>> - both the Debug and Release configurations mention a *different* >>> directory in Linker>General>Additional Library Directories. They are >>> different because they point to the Debug version and the Relase version of >>> loc4cxx respectively (apache-log4cxx-0.10.0\projects\Debug >>> and apache-log4cxx-0.10.0\projects\Release) >>> >>> >>> Of course both configurations of log4cxx were previously built with no >>> failure (from its Visual Studio project). They were built in "DLL" mode as >>> explained on the log4cxx web site. While doing a static library version is >>> on my todo list, I'd rather solve the present issue first. >>> >>> At this point in time, I suppose the 13 missing symbols are present in >>> the Debug version of the log4cxx.lib stub library, but not in the Release >>> version. How can I verify this hypothesis? What could explain that? How can >>> I fix it? >>> >>> Another hypothesis might be that there is yet another dependency that >>> needs to be set in Release mode only. This seems less plausible though. And >>> what would it be? >>> >>> Again, thanks for you answer. Any other idea on how I could make progress >>> on this issue? >>> >>> Regards, >>> >>> Jean-Denis >>> >>> >>> On May 7, 2010, at 10:29 , Fabian Jacquet wrote: >>> >>> Hi, >>> >>> The project configuration is different between debug and release. In >>> debug you certainly added log4cxx.lib in the field "Linker/Input/Additional >>> dependencies" but you have a drop-down which select the configuration, if >>> you switch to release, I think you don't have log4cxx.lib in "Additional >>> dependencies" . >>> >>> Don't forget to add the directory of this lib in the field >>> "Linker/General/Additional Library Directories" >>> >>> log4cxx.lib is not really a static lib. It's only the interface to the >>> dll class and functions. >>> >>> I hope it help you. >>> >>> On Fri, May 7, 2010 at 04:00, Jean-Denis Muys <jdm...@mac.com> wrote: >>> >>>> Hi, >>>> >>>> I have a Visual Studio 2008 project using log4cxx that links (and runs) >>>> fine in Debug mode using the Debug version of log4cxx, but fails to link in >>>> Release mode using the release version of log4cxx. Here are the 13 >>>> undefined >>>> symbols: >>>> >>>> >>>> 1>------ Build started: Project: RepliKator04, Configuration: Release >>>> Win32 ------ >>>> 1>Linking... >>>> 1> Creating library >>>> z:\PCdev\RepliKator2004\RK_Demo_2004\plugins\RepliKator04.bundle\contents\windows\RepliKator04.lib >>>> and object >>>> z:\PCdev\RepliKator2004\RK_Demo_2004\plugins\RepliKator04.bundle\contents\windows\RepliKator04.exp >>>> 1>RKConnector.obj : error LNK2001: unresolved external symbol >>>> "__declspec(dllimport) public: static class >>>> log4cxx::helpers::ObjectPtrT<class log4cxx::Level> __stdcall >>>> log4cxx::Level::getTrace(void)" (__imp_?gettr...@level@log4cxx@ >>>> @sg?av?$objectp...@vlevel@log4cxx@@@help...@2@XZ) >>>> [...] >>>> 1>RepliKator04 - 13 error(s), 0 warning(s) >>>> ========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped >>>> ========== >>>> >>>> >>>> As I am a Mac developer, not a Windows developer, I feel lost here. What >>>> can I do to fix that issue? I really don't get why those symbols would not >>>> be defined in Release mode. >>>> >>>> Note that my project is not an application, but a Plugin for a third >>>> party app. >>>> I link against the DLL version of log4cxx. I'd rather use a static >>>> library version, but I failed to build it so, and I could not find detailed >>>> instructions on the net to do it. >>>> >>>> So for the time being, I am mainly interested in understanding why these >>>> link-time errors occur, and in how to fix them. >>>> >>>> Thanks and regards. >>>> >>>> Jean-Denis >>>> >>>> >>> >>> >> >> > >