As he is new to programming on windows, I suggested ant as it takes the build 
of log4cxx out of the Visual Studio as what he has built is corrupt in someway. 
It also enforces a clean build.
Better to start in small steps. Build the DLL and then in Visual Studio setup a 
new clean project for his application.

Things like __declspec are a pain to understand to people coming to it from a 
platform like ELF ( no idea what Darwin is ).

The first line of this link explains the fact that a lib file can be for a 
static or DLL library.  
http://msdn.microsoft.com/en-us/library/a90k134d%28VS.80%29.aspx



________________________________
From: David B Grigsby [mailto:dgrig...@yahoo-inc.com]
Sent: 07 May 2010 19:54
To: Log4CXX User
Subject: RE: link error in release mode with Visual Studio 2008

I suspect something about the VC release mode linker settings in the client 
project.

But for the library build, make sure the LOG4CXX_EXPORT stuff (preprocessor 
symbol) is setup the same in debug and release mode.

I agree I don't see how ant would be relevant.

When you figure it out, let us know what the problem was!

dg

________________________________
From: Fabian Jacquet [mailto:fabian.jacq...@gmail.com]
Sent: Friday, May 07, 2010 6:58 AM
To: Log4CXX User
Subject: Re: link error in release mode with Visual Studio 2008

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







Reply via email to