<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 >>> >>> >> >> > >