From mboxrd@z Thu Jan 1 00:00:00 1970 Received: (from weis@localhost) by pauillac.inria.fr (8.7.6/8.7.3) id TAA15076 for caml-red; Thu, 9 Nov 2000 19:08:05 +0100 (MET) Received: from concorde.inria.fr (concorde.inria.fr [192.93.2.39]) by pauillac.inria.fr (8.7.6/8.7.3) with ESMTP id QAA13874 for ; Thu, 9 Nov 2000 16:58:35 +0100 (MET) Received: from camelia.wanadoo.fr (smtp-rt-10.wanadoo.fr [193.252.19.59]) by concorde.inria.fr (8.11.1/8.10.0) with ESMTP id eA9FwBj28102 for ; Thu, 9 Nov 2000 16:58:16 +0100 (MET) Received: from amyris.wanadoo.fr (193.252.19.150) by camelia.wanadoo.fr; 9 Nov 2000 16:57:39 +0100 Received: from wfr01946 (164.138.50.178) by amyris.wanadoo.fr; 9 Nov 2000 14:34:01 +0100 Reply-To: From: "Lionel Fourquaux" To: "'Charles Neveu'" , Subject: RE: linking ocaml in multithreaded shared dll app Date: Thu, 9 Nov 2000 14:28:41 +0100 Message-ID: <000001c04a50$fbed35c0$b2328aa4@wfr01946> MIME-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit X-Priority: 3 (Normal) X-MSMail-Priority: Normal X-Mailer: Microsoft Outlook CWS, Build 9.0.2416 (9.0.2910.0) Importance: Normal In-Reply-To: <3A0855AC.77F9C627@artemis.arc.nasa.gov> X-MimeOLE: Produced By Microsoft MimeOLE V5.50.4133.2400 Sender: weis@pauillac.inria.fr > -----Message d'origine----- > De : Pierre.Weis@inria.fr [mailto:Pierre.Weis@inria.fr]De la part de > Charles Neveu > Envoye : mardi 7 novembre 2000 20:19 > A : caml-list@inria.fr > Objet : linking ocaml in multithreaded shared dll app > > > I'm trying to link the ocaml library into a Windows NT 4.0, > MS VC++ 6.0 > application that uses MFC in a shared dll (because another library, > OpenInventor, has to be linked this way). > I'm getting an unresolved external symbol error for the symbols > __pctype, ___mb_cur_max, and __dosmaperr from files like win32.obj, > read.obj, write.obj, etc. (complete text at bottom). That's because you're linking with msvcrt.dll (DLL version of Microsoft's C runtime). OCaml is linked with libcmt.lib (static multithreaded version of the same). > > I'm not a MSVC++ expert, but I'm guessing that the libunix library is > compiled to be linked with a statically-linked MFC library. Is this > right? Is there anyway to compile it to link to a > dynamically-linked MFC > library? Not exactly. OCaml doesn't use MFC. The problem is with the C library. Moreover, you can't build the libunix library for linking with msvcrt.dll, because it uses the internal function _dosmaperr, which is not exported by the DLL. > > Or is there something else going on? > > Charles > > Here is the linker output (ignore the first few Maestro errors, I'm > porting that): > --------------------Configuration: talkdll - Win32 > Debug-------------------- > Compiling... > Microsoft (R) 32-bit C/C++ Optimizing Compiler Version 12.00.8168 for > 80x86 > Copyright (C) Microsoft Corp 1984-1998. All rights reserved. > cl /MDd /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D ^^^^ This should be /MT. (See the documentation of the compiler.) > "_MBCS" /D "_AFXDLL" /Fp"Debug/talkdll.pch" /Yc"stdafx.h" /Fo"Debug/" > /Fd"Debug/" /FD /GZ /c > "E:\neveu\Development\talkdll\StdAfx.cpp" > StdAfx.cpp > Note: reusing persistent precompiled header > Compiling... > Microsoft (R) 32-bit C/C++ Optimizing Compiler Version 12.00.8168 for > 80x86 > Copyright (C) Microsoft Corp 1984-1998. All rights reserved. > cl /MDd /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D > "_MBCS" /D "_AFXDLL" /Fp"Debug/talkdll.pch" /Yu"stdafx.h" /Fo"Debug/" > /Fd"Debug/" /FD /GZ /c > "E:\neveu\Development\talkdll\Mbr.cpp" > "E:\neveu\Development\talkdll\talkdll.cpp" > "E:\neveu\Development\talkdll\talkdllDlg.cpp" > Skipping... (no relevant changes detected) > Mbr.cpp > talkdll.cpp > talkdllDlg.cpp > Linking... > msvcirtd.lib(MSVCIRTD.dll) : error LNK2005: "public: class ostream & > __thiscall ostream::operator<<(class ostream & > (__cdecl*)(class ostream > &))" (??6ostream@@QAEAAV0@P6AAAV0@AAV0@@Z@Z) already defined in > libmae-nt.lib(Maestro_Types.obj) > msvcirtd.lib(MSVCIRTD.dll) : error LNK2005: "class ostream & __cdecl > endl(class ostream &)" (?endl@@YAAAVostream@@AAV1@@Z) already > defined in > libmae-nt.lib(Maestro_Types.obj) > libmae-nt.lib(Maestro_GroupMember.obj) : error LNK2001: unresolved > external symbol "class ostream_withassign cerr" > (?cerr@@3Vostream_withassign@@A) > libmae-nt.lib(Maestro_GroupMember.obj) : error LNK2001: unresolved > external symbol "class ostream_withassign cout" > (?cout@@3Vostream_withassign@@A) > libmae-nt.lib(win32.obj) : error LNK2001: unresolved external symbol > __pctype > libmae-nt.lib(win32.obj) : error LNK2001: unresolved external symbol > ___mb_cur_max > libmae-nt.lib(read.obj) : error LNK2001: unresolved external symbol > __dosmaperr > libmae-nt.lib(write.obj) : error LNK2001: unresolved external symbol > __dosmaperr > libmae-nt.lib(close_on.obj) : error LNK2001: unresolved > external symbol > __dosmaperr > libmae-nt.lib(createprocess.obj) : error LNK2001: unresolved external > symbol __dosmaperr > libmae-nt.lib(spawn-nt.obj) : error LNK2001: unresolved > external symbol > __dosmaperr > libmae-nt.lib(dup.obj) : error LNK2001: unresolved external symbol > __dosmaperr > libmae-nt.lib(lseek.obj) : error LNK2001: unresolved external symbol > __dosmaperr > libmae-nt.lib(open.obj) : error LNK2001: unresolved external symbol > __dosmaperr > libmae-nt.lib(close.obj) : error LNK2001: unresolved external symbol > __dosmaperr > libmae-nt.lib(dup2.obj) : error LNK2001: unresolved external symbol > __dosmaperr > libmae-nt.lib(pipe.obj) : error LNK2001: unresolved external symbol > __dosmaperr > libmae-nt.lib(winwait.obj) : error LNK2001: unresolved external symbol > __dosmaperr > libmae-nt.lib(envir.obj) : error LNK2001: unresolved external symbol > __environ > libmae-nt.lib(execvp.obj) : error LNK2001: unresolved external symbol > __environ > Debug/talkdll.exe : fatal error LNK1120: 6 unresolved externals > Error executing link.exe. > > talkdll.exe - 21 error(s), 0 warning(s) > > -- > Dr. Charles Frederick Neveu T: 650 604-2525 > Autonomy and Robotics Group F: 650 604-4036 > NASA Ames Research Center E: neveu@artemis.arc.nasa.gov > Mail Stop 269-4 W: http://img.arc.nasa.gov/~neveu > Moffett Field, CA 94035-1000 > There are several solutions : * if the source is available, build OpenInventor with /MT instead of /MD, and use static libs everywhere (including MFC) * split your program into several DLLs that uses different versions of the C runtime (Be careful with this !) * try to build OCaml with /MD, using DOSMAP.C from the CRT source if you need libunix. And some people from this mailing list will probably suggest better solutions ! I hope this will help you. Lionel Fourquaux