| Title: | Microsoft Visual C++ bug reports and kits |
| Notice: | Register in Topic 2. 5.Last for latest Kit |
| Moderator: | DECWET::THOMAS N |
| Created: | Tue May 17 1994 |
| Last Modified: | Fri Jun 06 1997 |
| Last Successful Update: | Fri Jun 06 1997 |
| Number of topics: | 521 |
| Total number of notes: | 2938 |
I've got a customer who is calling some fortran routines from a vc++4.0
app on NT 4.0 Alpha and is getting multiply defined symbol errors when
linking. the code compiles alright. Any idea why? below is the make file
and error output.
/james
Category : nt
OS Version : 4.0
System H/W : alpha
Brief Description of Problem:
-----------------------------
Here is the makefile which contains routines that call other routines in a
standard LIB. This makefile is supplosed to create OVERLAY.DLL but fails
with Fatal Error: multiply defined symbols.
Thanks,
Jim Case
CRC Infomation Systems, Inc
(602) 451-7474
Output from make:
link /noentry /out:overlay.dll /dll @overlay.ooo overlay.exp dfordll.lib
\crc\overlay\insert\insert.lib
\crc\numeric\source\numeric.lib
\crc\kam\source\kam.lib
\crc\toolbox\source\toolbox.lib
Microsoft (R) 32-Bit Executable Linker Version 3.00.5270
Copyright (C) Microsoft Corp 1992-1995. All rights reserved.
addanypath.obj
addpath.obj
addprintpath.obj
addprintsycompath.obj
agebalbox.obj
attrf.obj
attrp.obj
attrs.obj
atype.obj
big.obj
blank.obj
box.obj
center.obj
chain.obj
chainm.obj
chkdate.obj
chkdaterng.obj
ckdgt.obj
clrarea.obj
clrln.obj
clrscr.obj
clrscr2.obj
cplace.obj
cpos.obj
crcbarcode.obj
crcedit.obj
crenam.obj
crtdisply.obj
crtinhp.obj
crtinput.obj
crtout.obj
cursoron.obj
date.obj
datei.obj
datrel.obj
day.obj
delay.obj
delnam.obj
dfilew.obj
dfl.obj
dirsrch.obj
displyhp.obj
doc.obj
dtimedrd.obj
dumbopen.obj
exinq.obj
expdate.obj
getkey.obj
getlog.obj
getscreen.obj
getsys.obj
getsys1.obj
getuser.obj
getvfub.obj
get_default_dir.obj
header.obj
hlinei.obj
ichr$.obj
idatrel.obj
ifauthorized.obj
inkey.obj
input.obj
ival.obj
jr30dasort.obj
lockit.obj
lpos.obj
lposd.obj
lpout.obj
lpplot.obj
lprint.obj
lprintd.obj
lptitl.obj
lvprnt.obj
mask.obj
mdata.obj
menudrvr.obj
nametomod.obj
okibar184.obj
okibarcode.obj
openbox.obj
ovreclock.obj
pfiler.obj
pfilew.obj
pfilewf.obj
phline.obj
pinit.obj
plotit.obj
pout.obj
pplot.obj
ppos.obj
ptitl.obj
pvline.obj
pvlinec.obj
pvlinel.obj
pvliner.obj
rchr$.obj
recfmt.obj
recint.obj
reclock.obj
reldat.obj
relidat.obj
rval.obj
sbmtcom.obj
scplot.obj
scplus.obj
scprntn.obj
screenon.obj
scriptcheck.obj
sctitl.obj
sendmail.obj
sendmailmessage.obj
serror.obj
spawn.obj
start.obj
subtitle.obj
sycalc.obj
termtype.obj
title.obj
today.obj
userno.obj
vali.obj
validate.obj
valr.obj
version.obj
vflongopen.obj
vfub.obj
vfup.obj
vfus.obj
vlinei.obj
wait.obj
wmbarmenu.obj
wmbarselect.obj
wmclearmenu.obj
wmgetfile.obj
wmgethotkey.obj
wmsetattr.obj
wmsethelp.obj
wmsethotkey.obj
yearrel$.obj
zerosup.obj
LIBC.lib(otsdiv.obj) : error LNK2005: _OtsDivide64 already defined in
dfordll.lib(DFOR.dll)
LIBC.lib(otsdiv.obj) : error LNK2005: _OtsDivide32 already defined in
dfordll.lib(DFOR.dll)
LIBC.lib(otsdiv.obj) : error LNK2005: _OtsRemainder32 already defined in
dfordll.lib(DFOR.dll)
overlay.dll : fatal error LNK1169: one or more multiply defined symbols found
%%%%%%%%%%%%%%%%%%%%%%%
Content-Disposition: attachment; filename="makefile"
!INCLUDE "\utils\F77.MAK"
all: overlay.obj overlay.dll
# ------------------------------
# BUILD OBJECT FILES
# ------------------------------
overlay.obj:: *.F77
$(f77) $(fflags) /c \
!INCLUDE "overlay.ff1"
$(f77) $(fflags) /c \
!INCLUDE "overlay.ff2"
overlay.obj:: *.c
CL /c /Gy *.c
# ------------------------------
# BUILD EXPORT LIBRARY
# ------------------------------
overlay.lib overlay.exp: overlay.def
$(libr) /out:overlay.lib /machine:$(CPU) /def:overlay.def
# ------------------------------
# BUILD DLL
# ------------------------------
overlay.dll: overlay.exp overlay.lib
$(link) /noentry /out:overlay.dll /dll \
@overlay.ooo overlay.exp dfordll.lib \
\crc\overlay\insert\insert.lib \
\crc\numeric\source\numeric.lib \
\crc\kam\source\kam.lib \
\crc\toolbox\source\toolbox.lib
clean:
-del overlay.dll
-del overlay.lib
-del overlay.exp
-del *.obj
------=_NextPart_000_01BC1F3A.329C4E80
Content-Type: application/octet-stream; name="F77.mak"
Content-Transfer-Encoding: quoted-printable
Content-Description: F77.mak (MAK File)
Content-Disposition: attachment; filename="F77.mak"
#+
# F77.MAK - DEC Fortran application master NMAKE definitions file
#
# This software F77.MAK is part of the DEC Fortran.
# Copyright (C) 1993, 1994, 1995 Digital Equipment Corporation.
# All rights reserved.
#
# This software is furnished to you under a license by Digital Equipment
# Corporation and must be used only in accordance with the terms and conditions
# of that license, and only with the inclusion of the above copyright notice.
# This software is protected by both United States copyright law and
# international treaty provisions.
#
# This file should be included at the top of all MAKEFILEs as follows:
# !include <f77.mak>
#
# NMAKE Options:
#
# Use the table below to determine the additional options for NMAKE
# Application Information Type Invoke NMAKE
# ---------------------------- ------------
# For Debugging Info nmake debug=3D1
# For linker map nmake linkmap=3D1
# For linking with the DLLs nmake linkdll=3D1
#-
!IF "$(CPU)" !=3D "ALPHA"
!ERROR This NMAKE definitions file is for Alpha AXP system only.
!ENDIF
!IF "$(DECFORT_TOOLS)" =3D=3D ""
!ERROR DECFORT_TOOLS must be defined to be one of MSVC20, MSDN35 or MSDN31
!ENDIF
!IF ( ("$(DECFORT_TOOLS)" "MSVC20") || ("$(DECFORT_TOOLS)" "msvc20") )
crtimplibmsvcrt.lib
!IFNDEF link
link link
!ENDIF
!IFNDEF libr
libr lib
!ENDIF
!ENDIF
!IF ( ("$(DECFORT_TOOLS)" "MSDN35") || ("$(DECFORT_TOOLS)" "msdn35") )
crtimplibcrtdll.lib
!IFNDEF link
link link
!ENDIF
!IFNDEF libr
libr lib
!ENDIF
!ENDIF
!IF ( ("$(DECFORT_TOOLS)" "MSDN31") || ("$(DECFORT_TOOLS)" "msdn31") )
crtimplibcrtdll.lib
!IFNDEF link
link link32
!ENDIF
!IFNDEF libr
libr lib32
!ENDIF
!ENDIF
# Default
!IFNDEF link
link link
!ENDIF
!IFNDEF libr
libr lib
!ENDIF
#+
# Define the compiler verbs.
#-
FOR f77
f77 f77
#+
# Macros for the compiler
#-
#f77_standard /fort /novms /align:norecords /align:dcommons
/extend_source /optimize:0 /real_size:64 /warn:declarations /nolink
f77_standard /fort /novms /align:norecords /align:dcommons
/extend_source \
/optimize:0 /real_size:64 /warn:declarations /align:commons /call_dll
!IFDEF DEBUG
f77_debug /debug:full
lnk_debug /debug:full /debugtype:both
!ELSE
f77_debug /debug:none
lnk_debug /debug:none
!ENDIF
!IFDEF LINKDLL
f77_dll /call_dll
!IF ( ("$(DECFORT_TOOLS)" "MSDN31") || ("$(DECFORT_TOOLS)" "msdn31") )
f77libs dfordll.lib dmathdll.lib dotsdll.lib dutildll.lib \
$(crtimplib) kernel32.lib
!ELSE
f77libs dfordll.lib $(crtimplib) kernel32.lib
!ENDIF
!ELSE
f77_dll
!IF ( ("$(DECFORT_TOOLS)" "MSDN31") || ("$(DECFORT_TOOLS)" "msdn31") )
#f77libs dfor.lib dmath.lib dots.lib dutil.lib libc.lib kernel32.lib
f77libs dfor.lib dmath.lib dots.lib dutil.lib kernel32.lib
!ELSE
#f77libs dfor.lib libc.lib kernel32.lib
f77libs dfor.lib kernel32.lib
!ENDIF
!ENDIF
fflags $(f77_debug) $(f77_dll) $(f77_standard)
#+
# Macros for the FPP Preprocesor
#-
fpp $(f77) $(fflags) /fpp
fppflags
#+
# Macros for the linker.
#-
!IFDEF LINKMAP
lflags /map:$(*B).map $(lflags)
!ELSE
lflags $(lflags)
!ENDIF
#+
# Add .fpp to the .SUFFIXES list
#-
.SUFFIXES: .exe .obj .asm .c .bas .cbl .fpp .for .pas .res .rc
#+
# Define the inference rules
#-
.obj.exe:
$(f77) $(f77_dll) $(f77_debug) /link $(lflags) $(lnk_debug) $*.obj
.for.exe:
$(f77) $(fflags) $*.for /link $(lflags)
.fpp.exe:
$(fpp) $(fppflags) $*.fpp /link $(lflags)
.for.obj:
$(f77) $(f77_debug) $*.for /nolink /object:$@
.fpp.obj:
$(f77) $(f77_debug) /nolink /object:$@ /fpp $(fppflags) $*.fpp
| T.R | Title | User | Personal Name | Date | Lines |
|---|---|---|---|---|---|
| 467.1 | don't mix and (not)match | CANDOO::GRIEB | Fri Feb 21 1997 09:46 | 30 | |
James, In general, unless you REALLY know what you are doing, the rule for builing images is: "If you link against ANY DLL's (not counting system ones) then you should link against ALL DLL's". In other words, if you are building a "statically linked app" then don't link against any import libs. If you are building an app (or DLL) that is linked against other DLL's then link against the DLL version (not the static version) of ALL the other libraries. If you don't do this you will find that you have multiple copies of "shared" data (for instance, you will have multiple errno's, multiple ctype tables, etc. etc.) In your case you are linking against a DLL import library (dfordll.lib) and a <<STATIC>> C library (libc.lib). This creates just the type of problem you are seeing. The solution is to link all static or all DLL. Since it looks like you are in fact building a DLL, this implies that you should link all DLL so the "dfordll.lib" is correct but you need to link against the DLL version of the C library. Libc.lib may be being pulled in because you didn't compile using /MD when you compiled the C code. Using /LINK /NODEFAULTLIB may "fix the problem" but may leave you with multiple copies of errno, etc. Recompile the C code with /MD to REALLY fix the problem and not just hide the symptom. I hope that helps. | |||||
| 467.2 | Thanks-i'll pass it on | BLAZER::MIKELIS | Software Partner's Eng. MR01-3/F26 | Fri Feb 21 1997 11:36 | 1 |