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

Reply via email to