Hi Axel,
I managed to get quite far in porting my stuff into this new environment, but I’ve hit a problem. Actually it’s the same problem you helped me with when I ported to cygwin/gcc…
In case you don’t remember I build several different class libraries, with dependencies between the classes in different libraries. To build the libraries I am using the following part of $ROOTSYS/test/Makefile:
$(LIB_SO): $(OBJECTS) $(DICT_OBJ)
…
ifeq ($(PLATFORM),win32)
bindexplib lib$(PROJ_NAME) $^ > lib$(PROJ_NAME).def
lib -nologo -MACHINE:IX86 $^ -def:lib$(PROJ_NAME).def $(OutPutOpt)$(LIB_LIB)
$(LD) $(SOFLAGS) $(LDFLAGS) $^ lib$(PROJ_NAME).exp $(LIBS) $(GLIBS) $(LINK_LIB) $(OutPutOpt)$@
etc. etc.
where
PROJ_NAME = root name of library to build (KVMultiDet, KVVarGlob, etc.)
LIB_LIB = lib$(PROJ_NAME).lib
LIB_SO = lib$(PROJ_NAME).$(DllSuf) = lib$(PROJ_NAME).dll
OBJECTS = all the .obj of the classes in the library
DICT_OBJ = .obj of the rootcint-generated dictionary code
The other symbols should be defined in Makefile.arch.
I have a base library libKVMultiDet.dll which only depends on ROOT classes. I can build this with no problem.
Then libKVVarGlob.dll and libKVTrieur.dll both use classes in libKVMultiDet.dll. These I build by adding libKVMultiDet to LINK_LIB like so:
'C:\cygwin\home\frankland\KaliVeda\lib\libKVMultiDet.lib’
so that the entire ‘link’ looks like this:
link -DLL -opt:ref -pdb:none -nologo base/KVGVList.obj base/KVVarGlob.obj base/KVVarGlob1.obj base/KVVarGlobMean.obj charge/KVZbound.obj charge/KVZboundAv.obj charge/KVZmax.obj charge/KVZmean.obj charge/KVZtot.obj charge/KVZtotAv.obj energy/KVEkin.obj energy/KVEtrans.obj energy/KVEtransLCP.obj multiplicity/KVMultAv.obj multiplicity/KVMultIMF.obj multiplicity/KVMultIMFAv.obj multiplicity/KVMultLeg.obj multiplicity/KVMultLegAv.obj shape/KVRiso.obj shape/KVRisoAv.obj shape/KVTensP.obj shape/KVTensPCM.obj shape/KVTenseur3.obj momentum/KVPtot.obj momentum/KVZVtot.obj KVVarGlobDict.obj libKVVarGlob.exp -include:_G__cpp_setupG__Hist -include:_G__cpp_setupG__Graf1 -include:_G__cpp_setupG__G3D -include:_G__cpp_setupG__GPad -include:_G__cpp_setupG__Tree -include:_G__cpp_setupG__Rint -include:_G__cpp_setupG__PostScript -include:_G__cpp_setupG__Matrix -include:_G__cpp_setupG__Physics ‘c:\root\lib\libCore.lib’ ‘c:\root\lib\libCint.lib’ ‘c:\root\lib\libHist.lib’ ‘c:\root\lib\libGraf.lib’ ‘c:\root\lib\libGraf3d.lib’ ‘c:\root\lib\libGpad.lib’ ‘c:\root\lib\libTree.lib’ ‘c:\root\lib\libRint.lib’ ‘c:\root\lib\libPostscript.lib’ ‘c:\root\lib\libMatrix.lib’ ‘c:\root\lib\libPhysics.lib’ -include:_G__cpp_setupG__Hist -include:_G__cpp_setupG__Graf1 -include:_G__cpp_setupG__G3D -include:_G__cpp_setupG__GPad -include:_G__cpp_setupG__Tree -include:_G__cpp_setupG__Rint -include:_G__cpp_setupG__PostScript -include:_G__cpp_setupG__Matrix -include:_G__cpp_setupG__Physics -include:_G__cpp_setupG__Gui1 ‘c:\root\lib\libCore.lib’ ‘c:\root\lib\libCint.lib’ ‘c:\root\lib\libHist.lib’ ‘c:\root\lib\libGraf.lib’ ‘c:\root\lib\libGraf3d.lib’ ‘c:\root\lib\libGpad.lib’ ‘c:\root\lib\libTree.lib’ ‘c:\root\lib\libRint.lib’ ‘c:\root\lib\libPostscript.lib’ ‘c:\root\lib\libMatrix.lib’ ‘c:\root\lib\libPhysics.lib’ ‘c:\root\lib\libGui.lib’ ‘C:\cygwin\home\frankland\KaliVeda\lib\libKVMultiDet.lib’ -out:libKVVarGlob.dll
That works too. The problem is when I want to build libKVIndra.dll, which uses classes in both libKVMultiDet and libKVVarGlob. I add both libraries to LINK_LIB, but I get unresolved symbols concerning classes in the two libraries:
link -DLL -opt:ref -pdb:none -nologo analysis/KVINDRADataAnalyser.obj analysis/KVINDRAInteractiveDataAnalyser.obj analysis/KVIdentRoot.obj analysis/KVReconIdent.obj analysis/KVSelector.obj calibration/KVChannelEnergyAlpha.obj calibration/KVChannelEnergyBrho.obj calibration/KVChannelEnergyChIo.obj calibration/KVChannelVolt.obj calibration/KVLightEnergyCsI.obj calibration/KVVoltEnergy.obj db/KVDBAlphaPeak.obj db/KVDBChIoPressures.obj db/KVDBElasticPeak.obj db/KVDBParameterSet.obj db/KVDBPeak.obj db/KVDBTape.obj db/KVINDRADB.obj db/KVINDRADB1.obj db/KVINDRADB2.obj db/KVINDRADB4.obj db/KVINDRADBRun.obj db/KVINDRARunListReader.obj db/KVINDRARunSheetReader.obj db/KVINDRAUpDater.obj db/KVRunListLine.obj detectors/KVChIo.obj detectors/KVCsI.obj detectors/KVPhoswich.obj detectors/KVSilicon.obj events/KVINDRAReconEvent.obj events/KVINDRATriggerInfo.obj gui/KVINDRARunSheetGUI.obj gui/KVNewGridRRMDialog.obj identification/KVIDChIoCsI.obj identification/KVIDChIoSi.obj identification/KVIDChIoSi75.obj identification/KVIDCsI.obj identification/KVIDCsIRLLine.obj identification/KVIDGChIoSi.obj identification/KVIDGCsI.obj identification/KVIDPhoswich.obj identification/KVIDSi75SiLi.obj identification/KVIDSiCsI.obj identification/KVIDSiLiCsI.obj identification/KVINDRACodeMask.obj identification/KVINDRACodes.obj indra/KVINDRA.obj indra/KVINDRA2.obj indra/KVINDRA4.obj indra/KVINDRARRMValidator.obj indra/KVINDRAe475s.obj particles/KVINDRAReconNuc.obj KVIndraDict.obj libKVIndra.exp -include:_G__cpp_setupG__Hist -include:_G__cpp_setupG__Graf1 -include:_G__cpp_setupG__G3D -include:_G__cpp_setupG__GPad -include:_G__cpp_setupG__Tree -include:_G__cpp_setupG__Rint -include:_G__cpp_setupG__PostScript -include:_G__cpp_setupG__Matrix -include:_G__cpp_setupG__Physics ‘c:\root\lib\libCore.lib’ ‘c:\root\lib\libCint.lib’ ‘c:\root\lib\libHist.lib’ ‘c:\root\lib\libGraf.lib’ ‘c:\root\lib\libGraf3d.lib’ ‘c:\root\lib\libGpad.lib’ ‘c:\root\lib\libTree.lib’ ‘c:\root\lib\libRint.lib’ ‘c:\root\lib\libPostscript.lib’ ‘c:\root\lib\libMatrix.lib’ ‘c:\root\lib\libPhysics.lib’ -include:_G__cpp_setupG__Hist -include:_G__cpp_setupG__Graf1 -include:_G__cpp_setupG__G3D -include:_G__cpp_setupG__GPad -include:_G__cpp_setupG__Tree -include:_G__cpp_setupG__Rint -include:_G__cpp_setupG__PostScript -include:_G__cpp_setupG__Matrix -include:_G__cpp_setupG__Physics -include:_G__cpp_setupG__Gui1 ‘c:\root\lib\libCore.lib’ ‘c:\root\lib\libCint.lib’ ‘c:\root\lib\libHist.lib’ ‘c:\root\lib\libGraf.lib’ ‘c:\root\lib\libGraf3d.lib’ ‘c:\root\lib\libGpad.lib’ ‘c:\root\lib\libTree.lib’ ‘c:\root\lib\libRint.lib’ ‘c:\root\lib\libPostscript.lib’ ‘c:\root\lib\libMatrix.lib’ ‘c:\root\lib\libPhysics.lib’ ‘c:\root\lib\libGui.lib’ ‘C:\cygwin\home\frankland\KaliVeda\lib\libKVMultiDet.lib’ ‘C:\cygwin\home\frankland\KaliVeda\lib\libKVVarGlob.lib’ -out:libKVIndra.dll
this gives a lot of warnings about locally defined symbols being imported (same for the other libraries, doesn’t stop them working), and then:
KVSelector.obj : error LNK2019: unresolved external symbol “private: static class TString KVBase::KVFilesDir” (?KVFilesDir@KVBase@@0VTString@@A) referenced in function “public: static char const * __cdecl KVBase::GetKVFilesDir(void)” (?GetKVFilesDir@KVBase@@SAPBDXZ)
KVNewGridRRMDialog.obj : error LNK2019: unresolved external symbol “protected: static double KVNewGridDialog::scale_y” (?scale_y@KVNewGridDialog@@1NA) referenced in function “protected: virtual void __thiscall KVNewGridRRMDialog::layout_parameter_control_widgets(void)” (?layout_parameter_control_widgets@KVNewGridRRMDialog@@MAEXXZ)
KVNewGridRRMDialog.obj : error LNK2019: unresolved external symbol “protected: static double KVNewGridDialog::scale_x” (?scale_x@KVNewGridDialog@@1NA) referenced in function “protected: virtual void __thiscall KVNewGridRRMDialog::layout_parameter_control_widgets(void)” (?layout_parameter_control_widgets@KVNewGridRRMDialog@@MAEXXZ)
KVNewGridRRMDialog.obj : error LNK2019: unresolved external symbol “protected: static bool KVNewGridDialog::choose_scales” (?choose_scales@KVNewGridDialog@@1_NA) referenced in function “protected: virtual void __thiscall KVNewGridRRMDialog::layout_parameter_control_widgets(void)” (?layout_parameter_control_widgets@KVNewGridRRMDialog@@MAEXXZ)
KVNewGridRRMDialog.obj : error LNK2019: unresolved external symbol “protected: static bool KVNewGridDialog::choose_runs” (?choose_runs@KVNewGridDialog@@1_NA) referenced in function “protected: virtual void __thiscall KVNewGridRRMDialog::layout_parameter_control_widgets(void)” (?layout_parameter_control_widgets@KVNewGridRRMDialog@@MAEXXZ)
KVNewGridRRMDialog.obj : error LNK2019: unresolved external symbol “protected: static bool KVNewGridDialog::choose_mods” (?choose_mods@KVNewGridDialog@@1_NA) referenced in function “protected: virtual void __thiscall KVNewGridRRMDialog::layout_parameter_control_widgets(void)” (?layout_parameter_control_widgets@KVNewGridRRMDialog@@MAEXXZ)
KVNewGridRRMDialog.obj : error LNK2019: unresolved external symbol “protected: static bool KVNewGridDialog::choose_rings” (?choose_rings@KVNewGridDialog@@1_NA) referenced in function “protected: virtual void __thiscall KVNewGridRRMDialog::layout_parameter_control_widgets(void)” (?layout_parameter_control_widgets@KVNewGridRRMDialog@@MAEXXZ)
libKVIndra.dll : fatal error LNK1120: 7 unresolved externals
KVNewGridRRMDialog is a class in libKVIndra.dll which inherits from KVNewGridDialog, a class in libKVMultiDet.dll.
As for KVSelector (the first error), this is a class in libKVIndra.dll, but the strange thing is it seems to be complaining about an undefined reference in KVBase to … itself … (KVBase is in libKVMultiDet.dll).
I guess I’ve probably missed something trivial, but can you please help me (again) ?
Thanks a lot
John