Avatar billede themepark Nybegynder
17. februar 2006 - 12:16 Der 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.

C:\MinGW\bin>gcc -c -IC:\jdk15\include -IC:\jdk15\include\win32 C:\C\Test.c -o C:\C\Test.obj

C:\MinGW\bin>gcc -s -shared -Wl,--export-all,--kill-at 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

Min kode er således (Test.c):
#include <jni.h>
#include "Test.h"
#include "pc.h"

JNIEXPORT void JNICALL Java_Test_PortTest(JNIEnv *env, jobject obj, jfloat frequency) {
    outportb(0x42, frequency);
}

Og Test.h:
/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class PC_Speaker */

#ifndef _Included_PC_Speaker
#define _Included_PC_Speaker
#ifdef __cplusplus
extern "C" {
#endif
/*
* Class:    Test
* Method:    PortTest
* Signature: (F)V
*/
JNIEXPORT void JNICALL Java_Test_PortTest
  (JNIEnv *, jobject, jfloat);

#ifdef __cplusplus
}
#endif
#endif

Jeg kan ikke umiddelbart se, hvad der skulle være galt, da jeg jo har includet pc.h, hvor outportb funktionen befinder sig.
Avatar billede soreno Praktikant
17. februar 2006 - 12:22 #1
Du mangler at linke med det library hvor pc.h er implementeret.
Avatar billede themepark Nybegynder
17. februar 2006 - 12:33 #2
Den skal jeg lige have igen, på newbie sprog...sorry :(
Avatar billede themepark Nybegynder
17. februar 2006 - 12:40 #3
Hmm...skal det forstås sådan at pc.h også skal includes i Test.h?
Avatar billede soreno Praktikant
17. februar 2006 - 12:41 #4
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
Avatar billede themepark Nybegynder
17. februar 2006 - 12:50 #5
Hmm, javel ja. Problemet er at jeg bruger pc.h fra DJGPP, og jeg aner ikke hvilket library der så implementerer outportb :(
Avatar billede soreno Praktikant
17. februar 2006 - 12:54 #6
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).
Avatar billede themepark Nybegynder
17. februar 2006 - 13:04 #7
Total Commander <3 Dejligt lille program :D

Den fandt ganske rigtigt et library libc.a, hvor outport står i. Men når jeg nu prøver at lave min dll fil, får jeg følgende fejl:

C:\MinGW\bin>gcc -s -shared -Wl,--export-all,--kill-at -lC:\DJGPP\lib\libc.a C:\
C\Test.obj -o C:\C\Test.dll
.\..\lib\gcc\mingw32\3.4.2\..\..\..\..\mingw32\bin\ld.exe: cannot find -lC:\DJGP
P\lib\libc.a
collect2: ld returned 1 exit status

Og jeg er fuldstændig sikker på at det er den rigtige sti, se bare her:

Directory of C:\DJGPP\lib

17-02-2006  11:52    <DIR>          .
17-02-2006  11:52    <DIR>          ..
11-12-2001  22:11            4.433 crt0.o
30-07-1999  03:50              722 djgpp.djl
25-08-1999  05:45              151 dxe.ld
17-02-2006  11:52    <DIR>          gcc
11-12-2001  22:11            4.475 gcrt0.o
17-02-2006  11:52    <DIR>          ldscripts
24-12-2001  21:24          637.286 libc.a
24-12-2001  21:24            37.480 libdbg.a
24-12-1999  17:47            66.496 libemu.a
14-12-1999  07:14              470 libg.a
14-12-1999  07:13          201.144 libm.a
15-03-2003  15:12          225.784 libpakke.a
14-12-1999  07:14              470 libpc.a
Avatar billede soreno Praktikant
17. februar 2006 - 13:06 #8
Prøv at skrotte -l foran stien til library.
Altså noget ala:
gcc -s -shared -Wl,--export-all,--kill-at C:\DJGPP\lib\libc.a C\Test.obj -o C:\C\Test.dll

Og måske det er "libpc.a" du skal linke med ?
Avatar billede themepark Nybegynder
17. februar 2006 - 13:10 #9
Hvis jeg bruger libpc.a, får jeg følgende fejl:

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

Jesus Christ! :(
Avatar billede themepark Nybegynder
17. februar 2006 - 13:13 #10
Hmm...siden de begge snakker om en undefined reference to 'outportb', så er det måske ikke nogle af dem jeg skal bruge.
Avatar billede soreno Praktikant
17. februar 2006 - 13:22 #11
Har du overvejet at bruge sound funktionen ?
http://www.programmershelp.co.uk/showcode.php?e=289
Avatar billede themepark Nybegynder
17. februar 2006 - 13:40 #12
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.
Avatar billede themepark Nybegynder
19. februar 2006 - 23:05 #13
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.
Avatar billede themepark Nybegynder
20. februar 2006 - 05:56 #14
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 :)
Avatar billede soreno Praktikant
20. februar 2006 - 07:58 #15
Ok.
Avatar billede Ny bruger Nybegynder

Din løsning...

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.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester