logging-log4cxx-user mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From Fabian Jacquet <fabian.jacq...@gmail.com>
Subject Re: link error in release mode with Visual Studio 2008
Date Fri, 07 May 2010 13:26:34 GMT
<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 <jdmuys@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 <jdmuys@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 <jdmuys@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_?getTrace@Level@log4cxx@
>>> @SG?AV?$ObjectPtrT@VLevel@log4cxx@@@helpers@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

View raw message