17. februar 2006 - 12:16Der er
14 kommentarer og 1 løsning
undefined reference in 'outportb'
Jeg har prøvet at lave et lille test program, som skriver til en port vha. outportb. Jeg får desværre en fejl, når jeg prøver at lave den om til en dll.
En header fil (.h) indeholder definitionerne på hvordan nogle funktioner ser ud.
f.eks noget ala: int foo(*bar);
Men implementationen, dvs: int foo(bar *b) { .. return 0; }
findes i en c fil. Denne fil er så typisk kompileret til et library som man så linker med.
Dvs. du skal finde det library hvori funktionen "outportb" er implementeret og tilføje det til kommandoen for at linke: gcc -s -shared -Wl,--export-all,--kill-at -l????? C:\C\Test.obj -o C:\C\Test.dll
Ja, det er et problem. Et endnu større problem er at jeg har kigget på google og har ikke kunnet finde det pågældende library.
Jeg plejer at løse library problemer ved at søge i lib/ directory for compileren. Jeg bruger Total Commanders søgefunktion ved at stå i lib/ og trykke søg (F1 hos mig), så vælger jeg "Find text" og i dette tilfælde ville jeg skrive "outportb" og på den måde finde det pågældende library.
Jeg har ingen anelse om Windows kan søge i binære file (derfor forklaring vha. TC).
C:\MinGW\bin>gcc -s -shared -Wl,--export-all,--kill-at C:\DJGPP\lib\libpc.a C:\C \Test.obj -o C:\C\Test.dll C:\C\Test.obj(.text+0x34):Test.c: undefined reference to `outportb' collect2: ld returned 1 exit status
Mens libc.a giver følgende mange fejl: C:\MinGW\bin>gcc -s -shared -Wl,--export-all,--kill-at C:\DJGPP\lib\libc.a C:\C\ Test.obj -o C:\C\Test.dll Cannot export exception_stack: symbol not found C:\DJGPP\lib\libc.a(_main.o)(.text+0x1a):_main.c: undefined reference to `djgpp_ last_ctor' C:\DJGPP\lib\libc.a(_main.o)(.text+0x1f):_main.c: undefined reference to `djgpp_ first_ctor' C:\DJGPP\lib\libc.a(_main.o)(.text+0x2f):_main.c: undefined reference to `djgpp_ first_ctor' C:\DJGPP\lib\libc.a(stub0031.o)(.text+0x1):sbrk.stub: undefined reference to `__ sbrk' C:\DJGPP\lib\libc.a(crt1.o)(.text+0x81):crt1.c: undefined reference to `__exit' C:\DJGPP\lib\libc.a(crt1.o)(.text+0x134):crt1.c: undefined reference to `_stubin fo' C:\DJGPP\lib\libc.a(crt1.o)(.text+0x1b3):crt1.c: undefined reference to `_stubin fo' C:\DJGPP\lib\libc.a(crt1.o)(.text+0x1e4):crt1.c: undefined reference to `_stubin fo' C:\DJGPP\lib\libc.a(crt1.o)(.text+0x2f6):crt1.c: undefined reference to `_stubin fo' C:\DJGPP\lib\libc.a(crt1.o)(.text+0x3de):crt1.c: undefined reference to `_crt0_i nit_mcount' C:\DJGPP\lib\libc.a(dpmiexcp.o)(.text+0x162):dpmiexcp.c: undefined reference to `_stklen' C:\DJGPP\lib\libc.a(dpmiexcp.o)(.text+0x16b):dpmiexcp.c: undefined reference to `__djgpp_selector_limit' C:\DJGPP\lib\libc.a(dpmiexcp.o)(.text+0x5da):dpmiexcp.c: undefined reference to `__djgpp_selector_limit' C:\DJGPP\lib\libc.a(dpmiexcp.o)(.text+0x83d):dpmiexcp.c: undefined reference to `_stklen' C:\DJGPP\lib\libc.a(dpmiexcp.o)(.text+0x843):dpmiexcp.c: undefined reference to `__djgpp_stack_limit' C:\DJGPP\lib\libc.a(dpmiexcp.o)(.text+0x862):dpmiexcp.c: undefined reference to `__djgpp_stack_limit' C:\DJGPP\lib\libc.a(dpmiexcp.o)(.text+0xe2b):dpmiexcp.c: undefined reference to `__djgpp_base_address' C:\DJGPP\lib\libc.a(dpmiexcp.o)(.text+0xf65):dpmiexcp.c: undefined reference to `_stubinfo' C:\DJGPP\lib\libc.a(dpmiexcp.o)(.text+0xfc3):dpmiexcp.c: undefined reference to `__exit' C:\DJGPP\lib\libc.a(c1args.o)(.text+0x6ea):c1args.c: undefined reference to `_st ubinfo' C:\DJGPP\lib\libc.a(c1args.o)(.text+0x7c0):c1args.c: undefined reference to `_st ubinfo' C:\DJGPP\lib\libc.a(c1args.o)(.text+0x854):c1args.c: undefined reference to `_st ubinfo' C:\DJGPP\lib\libc.a(exit.o)(.text+0x33):exit.c: undefined reference to `djgpp_la st_dtor' C:\DJGPP\lib\libc.a(exit.o)(.text+0x38):exit.c: undefined reference to `djgpp_fi rst_dtor' C:\DJGPP\lib\libc.a(exit.o)(.text+0x49):exit.c: undefined reference to `djgpp_fi rst_dtor' C:\DJGPP\lib\libc.a(putpath.o)(.text+0x1fa):putpath.c: undefined reference to `_ _djgpp_stack_limit' C:\DJGPP\lib\libc.a(putpath.o)(.text+0x264):putpath.c: undefined reference to `_ _djgpp_stack_limit' C:\C\Test.obj(.text+0x34):Test.c: undefined reference to `outportb' /mingw/lib/libmingw32.a(main.o)(.text+0x106):main.c: undefined reference to `Win Main@16' collect2: ld returned 1 exit status
Ja, det har jeg skam, men jeg vil i første omgang helst prøve at se om jeg kan få det til at virke selv. Jeg vender tilbage, når jeg har prøvet at makke lidt med det derhjemme.
Du har egentlig ret, der er jo ingen grund til at opfinde den dybe tallerken. Og jeg har makket med sound, og fik også de der undefined reference fejl på den, indtil jeg fandt ud af at -lc skal sættes til aller sidst i gcc kommandoen, altså efter navnet på dll filen, så virker det i hvert fald for mig. Jeg får så en masser andre fejl, men hvis jeg kan løse dem, så vil jeg også kunne bruge outport, da de er defineret i samme header fil og samme library.
Jeg har fået hjælp til en anden compiler, som klarer det med en del færre fejl. Og som sagt er der ingen grund til at jeg bruger outport hvis der er den sound funktion, så smid du endelig et svar :)
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.