Daniel Stenberg wrote:
On Thu, 9 Apr 2009, Sukender wrote:

... of course if you build a special build for the test _anyway_, why can't you instead make that build a static lib and then we won't need a work-around at all?

For lib558, the problem is a bit different. The linker doesn't find some symbols, like Curl_hash_destroy and Curl_mk_dnscache. Any idea why?

Yes, because when you build a DLL that DLL only exposes the functions we have told it to expose. Curl_hash_destroy and Curl_mk_dnscache are not on that list since they're private.

I thought the _USRDLL define meant "Export anything" under MSVC... it seems to 
be wrong. Okay. So should we set those symbols public when CURL_HIDDEN_SYMBOLS is OFF?


I don't care about building lib558 only when using a static lib, but I thing CMake scripts should work in most cases, and I guess we're not far from making it run with lib558+DLL.

I don't see how you can make that work without one of these options:

 A) you build a "test version" of the lib to run the test with

or

B) you use the plain source code for the lib558 tool, but in my view that is opening all gates to pain and misery since we don't write libcurl source code in general to be that easy to rip out and use sub-parts from so it'll
    pull dependencies that will differ over time and what not.


Totally agreed with B). So A) only remains. My knowledge of libcurl is limited, 
so sorry if I'm a bit slow... Why can't we simply have:
1. CURL_HIDDEN_SYMBOLS is ON  => "normal" lib => no 558, or
2. CURL_HIDDEN_SYMBOLS is OFF => lib with additional symbols => everything ok, 
including 558?


And about the define to avoid DLL linkage problem, I suggest:
#ifdef USES_DIRECT_CURL_UTILITIES
#define CURL_UTILITY_EXTERN
#else
#define CURL_UTILITY_EXTERN CURL_EXTERN
#endif

And changing CURL_EXTERN to CURL_UTILITY_EXTERN when needed. For example with curl_strequal, we would change:
CURL_EXTERN int (curl_strequal)(const char *s1, const char *s2);
to
CURL_UTILITY_EXTERN int (curl_strequal)(const char *s1, const char *s2);

But that's not clear if it sounds coherent with my first remark... Any idea?

Well, first I would find the term CURL_UTILITY_EXTERN quite strange. What does it mean? And in this particular example, why would that need to be modified? It is already exported!

Actually, for tests/server these must not be exported (since the .c files are included in the test, without linking to libcurl). So the goal was to add a define in tests/server projects so that the CURL_EXTERN (or equivalent) becomes empty.

About that, can we simply set CURL_EXTERN to be void when a special define is 
set (in test/server projects, which include .c file directly)?
( Or should we rename CURL_UTILITY_EXTERN to 
CURL_EXTERN_BUT_NOT_IF_YOU_INCLUDE_LIB_FILES_DIRECTLY? ;D )


--
Sukender
PVLE - Lightweight cross-platform game engine - http://pvle.sourceforge.net/

Reply via email to