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:57:50 GMT
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 <jdmuys@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 <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
>>>> 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