Folks,
I have into a problem I don’t understand when building some EPICS modules with recent versions of Cygwin. My version is currently 2.0.1 with gcc 4.8.3
$ more /proc/version
CYGWIN_NT-6.1-WOW version 2.0.1(0.287/5/3) ([email protected]) (gcc version 4.8.3 20140522 (Fedora Cygwin 4.8.3-6) (GCC) ) 2015-04-30 18:13
This is the problem I get when building mca/mcaApp/CanberraSrc:
$ make
make -C O.cygwin-x86 -f ../Makefile TOP=../../.. \
T_A=cygwin-x86 install
make[1]: Entering directory '/cygdrive/j/epics/devel/mca/mcaApp/CanberraSrc/O.cygwin-x86'
g++ -o mcaCanberra.dll -shared -Wl,--out-implib,mcaCanberra.lib -L/cygdrive/j/epics/devel/mca/lib/cygwin-x86 -L/cygdrive/h/epics/base-3.14.1
2.5/lib/cygwin-x86 -L/cygdrive/j/epics/devel/asyn-4-26/lib/cygwin-x86 -m32 nmc_comm_subs_1.o nmc_comm_subs_2.o nmc_user
_subs_1.o nmc_user_subs_2.o drvMcaAIMAsyn.o icb_strings.o icb_crmpsc.o icb_handler_subs.o icb_control_subs.o icb_control_subs2.o icb_user_su
bs.o icb_show_modules.o drvIcbAsyn.o DSA2000.o mcaCanberraRegister.o -lasyn -lrecIoc -lsoftDevIoc -lmiscIoc -lrsrvIoc -ldbtoolsIoc -lasIo
c -ldbIoc -lregistryIoc -ldbStaticIoc -lca -lCom -lwpcap -lPacket -ltirpc -lpthread -lm
/cygdrive/j/epics/devel/mca/lib/cygwin-x86/wpcap.lib: error adding symbols: File in wrong format
collect2: error: ld returned 1 exit status
/corvette/usr/local/epics/base-3.14.12.5/configure/RULES_BUILD:300: recipe for target 'mcaCanberra.dll' failed
make[1]: *** [mcaCanberra.dll] Error 1
This is the error I get when building dxp/dxpApp/handelSrc:
$ make
make -C O.cygwin-x86 -f ../Makefile TOP=../../.. \
T_A=cygwin-x86 install
make[1]: Entering directory '/cygdrive/j/epics/devel/dxp/dxpApp/handelSrc/O.cygwin-x86'
g++ -o handel.dll -shared -Wl,--out-implib,handel.lib -L/cygdrive/j/epics/devel/dxp/lib/cygwin-x86 -L/cygdrive/h/epics/base-3.14.12.5/lib/cy
gwin-x86 -m32 xerxes.o xerxes_log.o md_log.o handel.o fdd.o psl.o handel_dbg.o handel_detchan.o handel_dyn_default.o ha
ndel_dyn_detector.o handel_dyn_firmware.o handel_dyn_module.o handel_file.o handel_log.o handel_memdbg_win32.o handel_run_control.o handel_r
un_params.o handel_sort.o handel_system.o handel_xerxes.o xia_assert.o xia_file.o xia_mem.o xia_mem_point.o saturn.o saturn_psl.o xmap.o xma
p_psl.o mercury.o mercury_psl.o xia_epp.o xia_plx.o xia_usb.o xia_usb2.o md_win32.o -lrecIoc -lsoftDevIoc -lmiscIoc -lrsrvIoc -ldbtoolsIo
c -lasIoc -ldbIoc -lregistryIoc -ldbStaticIoc -lca -lCom -lDLPORTIO -lPlxApi -lsetupapi -lUser32 -lpthread -lm
/cygdrive/j/epics/devel/dxp/lib/cygwin-x86/PlxApi.lib: error adding symbols: File in wrong format
collect2: error: ld returned 1 exit status
/corvette/usr/local/epics/base-3.14.12.5/configure/RULES_BUILD:300: recipe for target 'handel.dll' failed
make[1]: *** [handel.dll] Error 1
make[1]: Leaving directory '/cygdrive/j/epics/devel/dxp/dxpApp/handelSrc/O.cygwin-x86'
/corvette/usr/local/epics/base-3.14.12.5/configure/RULES_ARCHS:64: recipe for target 'install.cygwin-x86' failed
make: *** [install.cygwin-x86] Error 2
In both cases the error is “error adding symbols: File in wrong format” when trying to link the DLL with a vendor library (.lib) file.
These same vendor libraries used to work fine when building statically on an older version of Cygwin.
Running “file” and “nm” on the .lib files seems to work OK:
$ file PlxApi.lib
PlxApi.lib: current ar archive
rivers@rivers-mobile2 /corvette/home/epics/devel/dxp/lib/cygwin-x86
$ nm PlxApi.lib
PlxApi631.dll:
00000000 i .idata$2
00000000 i .idata$4
00000000 i .idata$5
00000000 i .idata$6
000420ff a @comp.id
00000000 I __IMPORT_DESCRIPTOR_PlxApi631
U __NULL_IMPORT_DESCRIPTOR
U ⌂PlxApi631_NULL_THUNK_DATA
PlxApi631.dll:
000420ff a @comp.id
00000000 I __NULL_IMPORT_DESCRIPTOR
PlxApi631.dll:
000420ff a @comp.id
00000000 I ⌂PlxApi631_NULL_THUNK_DATA
PlxApi631.dll:
00000000 I .idata$4
00000000 I .idata$5
00000000 I .idata$6
00000000 T .text
00000000 I __imp__PlxPci_ApiVersion
U __IMPORT_DESCRIPTOR_PlxApi631
00000000 T _PlxPci_ApiVersion
PlxApi631.dll:
00000000 I .idata$4
00000000 I .idata$5
00000000 I .idata$6
00000000 T .text
00000000 I __imp__PlxPci_ChipTypeGet
U __IMPORT_DESCRIPTOR_PlxApi631
00000000 T _PlxPci_ChipTypeGet
PlxApi631.dll:
00000000 I .idata$4
00000000 I .idata$5
00000000 I .idata$6
00000000 T .text
00000000 I __imp__PlxPci_ChipTypeSet
U __IMPORT_DESCRIPTOR_PlxApi631
00000000 T _PlxPci_ChipTypeSet
…
Does anyone know what the problem could be, and how to work around it?
Thanks,
Mark