|
| probl. med at linke c++ Fra : Bjarne |
Dato : 12-07-01 20:36 |
|
Når jeg oversætter nedenstående program med :
gcc -o snot snot.c
glider det glat igennem, men hvis jeg oversætter med :
gcc -x c++ -o snot snot.c
får jeg følgende fejl :
/tmp/ccOUT3WE.o: In function `main':
/tmp/ccOUT3WE.o(.text+0xe): undefined reference to `ftime(timeb *)'
Det er en essensen af et større projekt, så glem bare at det i
sig selv er meningsløst.
Problemet optræder både med gcc 2.95.2 2.95.3 og 3.0 samt på
FreeBSD og TRU64, så det er sikkert bare et eller andet simpelt
jeg lige har overset i forbindelse med c++
#---------------------------------------------
#include <stdio.h>
#include <sys/types.h>
#include <sys/timeb.h>
#include <unistd.h>
extern int ftime(struct timeb *tp);
extern unsigned int sleep(unsigned int seconds);
main () {
struct timeb tid;
ftime (&tid);
sleep (2);
printf ("tid = %d Timezone = %d\n",
tid.time, tid.timezone);
}
#---------------------------------------------
mvh,
Bjarne
| |
Anders Melchiorsen (12-07-2001)
| Kommentar Fra : Anders Melchiorsen |
Dato : 12-07-01 22:40 |
|
bjb@c.dk (Bjarne) skrev:
> [...] jeg lige har overset i forbindelse med c++
> extern int ftime(struct timeb *tp);
> extern unsigned int sleep(unsigned int seconds);
Dette siger at der findes C++ funktioner med disse typer et eller
andet sted. Men det gør der ikke, der findes C funktioner. Derfor skal
du i stedet bruge 'extern "C"'.
Men i denne sammenhæng skal du blot bruge de rette .h filer i stedet
for at prøve at klare ærterne selv - så opstår problemet slet ikke.
Du kan dog få brug for 'extern "C"' hvis du roder med andet end
standardbiblioteker, især når du roder med egne gamle C stumper.
--
Regards, Anders
....if a Microsoft product fails, who do you sue?
| |
Igor V. Rafienko (13-07-2001)
| Kommentar Fra : Igor V. Rafienko |
Dato : 13-07-01 13:15 |
|
[ bjb@c.dk ]
> Når jeg oversætter nedenstående program med :
> gcc -o snot snot.c
>
> glider det glat igennem, men hvis jeg oversætter med :
>
> gcc -x c++ -o snot snot.c
>
> får jeg følgende fejl :
>
> /tmp/ccOUT3WE.o: In function `main':
> /tmp/ccOUT3WE.o(.text+0xe): undefined reference to `ftime(timeb *)'
Ypperlig eksempel på hvorfor man _ikke_ skal rote med "forward
declarations" av funksjoner som tilhører implementasjonen.
> #include <stdio.h>
> #include <sys/types.h>
> #include <sys/timeb.h>
> #include <unistd.h>
>
> extern int ftime(struct timeb *tp);
> extern unsigned int sleep(unsigned int seconds);
Jeg tror[tm] at det å bli kvitt disse to vil hjelpe på saken
betraktelig. Du skal ikke trenge disse, når <sys/timeb.h> og
<unistd.h> er #include'rt.
> main () {
int main() {
[snip]
ivr
--
Amy: Psst... look what life was like before genetic engeneering.
Leela: Those poor 20th century women...
-- Futurama, "Why must I be a Crustacean in love?"
| |
Bjarne (13-07-2001)
| Kommentar Fra : Bjarne |
Dato : 13-07-01 19:34 |
|
In article <m27kxdq12j.fsf@dolle.kalibalik.dk>,
Anders Melchiorsen <anders@kalibalik.dk> writes:
> bjb@c.dk (Bjarne) skrev:
>
>> [...] jeg lige har overset i forbindelse med c++
>
>> extern int ftime(struct timeb *tp);
>> extern unsigned int sleep(unsigned int seconds);
>
> Dette siger at der findes C++ funktioner med disse typer et eller
> andet sted. Men det gør der ikke, der findes C funktioner. Derfor skal
> du i stedet bruge 'extern "C"'.
>
Bingo ! Den sad. Nu lykkedes det.
> Men i denne sammenhæng skal du blot bruge de rette .h filer i stedet
> for at prøve at klare ærterne selv - så opstår problemet slet ikke.
Hm.. det troede jeg faktisk også jeg gjorde.
>
> Du kan dog få brug for 'extern "C"' hvis du roder med andet end
> standardbiblioteker, især når du roder med egne gamle C stumper.
>
Det eneste der nu er tilbage er :
/usr/bin/ld:
Unresolved:
__gxx_personality_v0
collect2: ld returned 1 exit status
når jeg bruger gcc 3.0 på TRU64
Tak for hjælpen så langt.
mvh,
Bjarne
| |
Bjarne (13-07-2001)
| Kommentar Fra : Bjarne |
Dato : 13-07-01 19:37 |
|
In article <xjvae29xbxn.fsf@nicotera.ifi.uio.no>,
igorr@ifi.uio.no (Igor V. Rafienko) writes:
> [ bjb@c.dk ]
>
>> Når jeg oversætter nedenstående program med :
>> gcc -o snot snot.c
>>
>> glider det glat igennem, men hvis jeg oversætter med :
>>
>> gcc -x c++ -o snot snot.c
>>
>> får jeg følgende fejl :
>>
>> /tmp/ccOUT3WE.o: In function `main':
>> /tmp/ccOUT3WE.o(.text+0xe): undefined reference to `ftime(timeb *)'
>
>
> Ypperlig eksempel på hvorfor man _ikke_ skal rote med "forward
> declarations" av funksjoner som tilhører implementasjonen.
Hvis jeg ikke definerer dem først får jeg :
snot.cpp: In function `int main()':
snot.cpp:13: `ftime' undeclared (first use this function)
:snip
>
>> main () {
>
>
> int main() {
Ok, er med nu.
>
> [snip]
> ivr
Tak for svaret
mvh,
Bjarne
| |
Igor V. Rafienko (13-07-2001)
| Kommentar Fra : Igor V. Rafienko |
Dato : 13-07-01 20:31 |
|
[ bjb@c.dk ]
[ snip ]
> Hvis jeg ikke definerer dem først får jeg :
>
> snot.cpp: In function `int main()':
> snot.cpp:13: `ftime' undeclared (first use this function)
Og du kompilerer uten -ansi/-pedantic?
ivr
--
"Ma belle demoiselle, repondit Candide, quand on est amoureux, jaloux
et fouette par l'Inquisition, on ne se connait plus"
Voltaire, "Candide"
| |
Bjarne (13-07-2001)
| Kommentar Fra : Bjarne |
Dato : 13-07-01 20:47 |
|
In article <xjv1ynkk4n7.fsf@vellheitur.ifi.uio.no>,
igorr@ifi.uio.no (Igor V. Rafienko) writes:
> [ bjb@c.dk ]
>
> [ snip ]
>
>> Hvis jeg ikke definerer dem først får jeg :
>>
>> snot.cpp: In function `int main()':
>> snot.cpp:13: `ftime' undeclared (first use this function)
>
>
> Og du kompilerer uten -ansi/-pedantic?
Yep : gcc -x c++ -o snot snot.c
>
> ivr
mvh,
Bjarne
| |
Igor V. Rafienko (13-07-2001)
| Kommentar Fra : Igor V. Rafienko |
Dato : 13-07-01 21:34 |
|
[ bjb@c.dk ]
[snip]
> > Og du kompilerer uten -ansi/-pedantic?
>
> Yep : gcc -x c++ -o snot snot.c
Merkelig. Står det en eller annen festlig #ifdef rundt ftime
deklarasjonen i sys/timeb.h? (btw, jeg ville anbefale å bruke g++
direkte på C++ kode).
ivr
--
"Ma belle demoiselle, repondit Candide, quand on est amoureux, jaloux
et fouette par l'Inquisition, on ne se connait plus"
Voltaire, "Candide"
| |
Bjarne (14-07-2001)
| Kommentar Fra : Bjarne |
Dato : 14-07-01 08:17 |
|
In article <xjvk81c7emp.fsf@nicotera.ifi.uio.no>,
igorr@ifi.uio.no (Igor V. Rafienko) writes:
> [ bjb@c.dk ]
>
> [snip]
>
>> > Og du kompilerer uten -ansi/-pedantic?
>>
>> Yep : gcc -x c++ -o snot snot.c
>
>
> Merkelig. Står det en eller annen festlig #ifdef rundt ftime
> deklarasjonen i sys/timeb.h? (btw, jeg ville anbefale å bruke g++
> direkte på C++ kode).
Næ, det ser meget enkelt ud :
#ifndef _SYS_TIMEB_H_
#define _SYS_TIMEB_H_
/* The ftime(2) system call structure -- deprecated. */
struct timeb {
time_t time; /* seconds since the Epoch */
unsigned short millitm; /* + milliseconds since the Epoch */
short timezone; /* minutes west of CUT */
short dstflag; /* DST == non-zero */
};
#endif
Om jeg bruger g++ eller gcc -x c++ går ud på det samme.
mvh,
Bjarne
| |
|
|