Error need help


 
Thread Tools Search this Thread
Top Forums Programming Error need help
# 15  
Old 07-11-2006
Quote:
Originally Posted by Corona688
This might best be shown by example.

In a directory by itself, create this file:
Code:
// main.c
#include <stdio.h>

int main(int argc, char *argv[])
{
  int n;
  fprintf(stderr,"main(%d,[",argc);
  for(n=0; n<argc; n++)
    fprintf(stderr," '%s'",argv[n]);
  fprintf(stderr," ]);\n");
  return(0);
}

Then compile and run it like this:
Code:
# gcc main.c -o main
# ./main
main(1,[ './main' ]);
#

That works, but what you might not realize is that gcc is actually doing two steps, not one -- compilation, then linking. The compilation stage converts C code into assembly language, the linking stage ties everything together into an executable. Let's break it into two steps:
Code:
# gcc -c main.c -o main.o
# gcc main.o -o main
# ./main
main(1,[ './main' ]);
#

That's what gcc is ACTUALLY doing... converts the C file into an object file(.o), then links the object file into an executable.

Now let's try and use a function from another .c file. First, create this file:
Code:
// library.c
#include <stdio.h>

int library_function(int c)
{
  fprintf(stderr,"library_function(%d)\n",c);
  return(c-3);
}

Then, modify main.c to use it like this:
Code:
#include <stdio.h>

extern int library_function(int c);

int main(int argc, char *argv[])
{
  int n;
  fprintf(stderr,"main(%d,[",argc);
  for(n=0; n<argc; n++)
    fprintf(stderr," '%s'",argv[n]);
  fprintf(stderr," ]);\n");

  printf("library_function(%d) returns %d\n",32,library_function(32));

  return(0);
}

Finally, let's see what happens when we try and compile it, then link it:
Code:
# gcc -c main.c -o main.o
# gcc main.o -o main
main.o: In function `main':
main.c:(.text+0x86): undefined reference to `library_function'
collect2: ld returned 1 exit status
#

It doesn't work. It compiles it fine since there's no syntax errors in the program, but the function it wants is not in main.o! To get that function, we'll need to give it library.o too.
Code:
# gcc -c main.c -o main.o
# gcc -c library.c -o library.o
# gcc main.o library.o -o main
# ./main
main(1,[ './main' ]);
library_function(32)
library_function(32) returns 29
#

It works!

Now, if you want your makefile to do that, you need to tell it that the output file needs main.o and library.o. Here's a simple makefile:
Code:
main:main.o library_function.o
        $(CC) main.o library_function.o $(LDFLAGS) -o $@
clean:
        rm -f main main.o library_function.o

With that makefile in the main directory, let's try it:
Code:
# make clean
rm -f main main.o library_function.o
# make main
cc    -c -o main.o main.c
cc    -c -o library.o library.c
cc main.o library.o  -o main
# ./main
main(1,[ './main' ]);
library_function(32)
library_function(32) returns 29
#

It works!

So there you go. You'll need to find the .c file that these missing functions reside in, convert it to an object, then link it into your executable.

Dear Corona

I have to call you my coach. Thank you very much for taking your time to put all this line and explain for me. I learn a lot from explaination.

Here is what I found by following your instruction,

I ran the first program using gcc and it work, and second program with function and using gcc and it work.

Then when it came to makefile one. I have receive the below error

couliba@linux:~/main> make clean
rm -f main main.o library_function.o
couliba@linux:~/main> make main
cc -c -o main.o main.c
make: *** No rule to make target `library_function.o', needed by `main'. Stop.
couliba@linux:~/main>


Do not u think, the problem is my lunix installation. Because this is my notebook I just recently install lunix.

Any help is appreciated
# 16  
Old 07-11-2006
Simply the wrong filename. It goes by file extension, it does not know how to make a library_function.o when there's no library_function.c . Change library_function.c and library_function.o to library.c and library.o respectively and it should work.

Come to think of it, that was a mistake in my example wasn't it? Oops. Fixed.

Last edited by Corona688; 07-11-2006 at 11:26 AM..
# 17  
Old 07-12-2006
Quote:
Originally Posted by Corona688
Simply the wrong filename. It goes by file extension, it does not know how to make a library_function.o when there's no library_function.c . Change library_function.c and library_function.o to library.c and library.o respectively and it should work.

Come to think of it, that was a mistake in my example wasn't it? Oops. Fixed.

Dear Corona

Thank you very, I did the changes and it work for the simple.

but

I applied to my code and I still receive the smilar erorr but not as much as earlier. I have created object files for all my C files. You may need view the below tag.

Quote:

couliba@linux:~/usr/ga> make find_rules
cc -c -o find_rules.o find_rules.c
cc -c -o find_util.o find_util.c
cc -c -o find_functions.o find_functions.c
cc -c -o util.o util.c
cc -c -o gp.o gp.c
cc -c -o gp_util.o gp_util.c
cc find_rules.c find_util.c find_functions.c util.c gp.c gp_util.c -o find_rules
/tmp/ccRkjXgc.o(.text+0x33): In function `get_boolean':
util.c: warning: the `gets' function is dangerous and should not be used.
/tmp/cc1LxypZ.o(.text+0xa40): In function `read_data':
find_util.c: undefined reference to `log'
/tmp/cc1LxypZ.o(.text+0xaa1):find_util.c: undefined reference to `log'
/tmp/cc1LxypZ.o(.text+0xdf4): In function `compounded_return':
find_util.c: undefined reference to `log'
/tmp/cc1LxypZ.o(.text+0xeeb): In function `simulate_price':
find_util.c: undefined reference to `exp'
/tmp/cc1LxypZ.o(.text+0x10a6): In function `compute_return':
find_util.c: undefined reference to `log'
/tmp/cc1LxypZ.o(.text+0x11ed): In function `test_statistic':
find_util.c: undefined reference to `pow'
/tmp/cc1LxypZ.o(.text+0x1277):find_util.c: undefined reference to `pow'
/tmp/cc1LxypZ.o(.text+0x1311):find_util.c: undefined reference to `pow'
/tmp/cc1LxypZ.o(.text+0x1b91): In function `compute_t':
find_util.c: undefined reference to `sqrt'
/tmp/cc1LxypZ.o(.text+0x1c3c): In function `compute_stdev':
find_util.c: undefined reference to `pow'
/tmp/cc1LxypZ.o(.text+0x1c51):find_util.c: undefined reference to `sqrt'
/tmp/cc1LxypZ.o(.text+0x1c81): In function `simple_return':
find_util.c: undefined reference to `exp'
/tmp/ccLquGy3.o(.text+0x627): In function `eval_average':
find_functions.c: undefined reference to `floor'
/tmp/ccLquGy3.o(.text+0x739): In function `eval_maximum':
find_functions.c: undefined reference to `floor'
/tmp/ccLquGy3.o(.text+0x87c): In function `eval_minimum':
find_functions.c: undefined reference to `floor'
/tmp/ccLquGy3.o(.text+0x9ad): In function `eval_slope':
find_functions.c: undefined reference to `floor'
/tmp/ccLquGy3.o(.text+0xaca): In function `eval_volatility':
find_functions.c: undefined reference to `floor'
/tmp/ccLquGy3.o(.text+0xb58):find_functions.c: undefined reference to `pow'
/tmp/ccLquGy3.o(.text+0xbf2): In function `eval_lag':
find_functions.c: undefined reference to `floor'
/tmp/ccrHQ96N.o(.text+0xe0c): In function `select_rank':
gp_util.c: undefined reference to `pow'
/tmp/ccrHQ96N.o(.text+0xe21):gp_util.c: undefined reference to `floor'
collect2: ld returned 1 exit status
make: *** [find_rules] Error 1
Any help is very much appreciated.

Thank you dear
# 18  
Old 07-12-2006
Don't call people 'dear' unless you're married to them. Smilie

Your makefile is wrong. It's compiling all the C files together instead of all the objects. Which, while it will work, is awkward and hard to debug, avoids all the advantages of using a makefile in the first place, and does all the work twice.

Instead of
Code:
cc file.c file2.c file3.c ... -o exec

it should do
Code:
cc file.o file2.o file3.o ... -o exec

Some of those missing functions are functions you still haven't compiled, but a few are from the C math library. At the top of your makefile, add the line:
Code:
LDFLAGS=-lm

That will tell it to link in the math library.

If you're still missing functions, you're missing a file. Maybye whoever gave you the code didn't give you all of it.
# 19  
Old 07-13-2006
Bug

Quote:
Originally Posted by Corona688
Don't call people 'dear' unless you're married to them. Smilie

Your makefile is wrong. It's compiling all the C files together instead of all the objects. Which, while it will work, is awkward and hard to debug, avoids all the advantages of using a makefile in the first place, and does all the work twice.

Instead of
Code:
cc file.c file2.c file3.c ... -o exec

it should do
Code:
cc file.o file2.o file3.o ... -o exec

Some of those missing functions are functions you still haven't compiled, but a few are from the C math library. At the top of your makefile, add the line:
Code:
LDFLAGS=-lm

That will tell it to link in the math library.

If you're still missing functions, you're missing a file. Maybye whoever gave you the code didn't give you all of it.
Smilie Smilie Smilie Smilie Smilie Smilie Smilie Smilie
Coach
Thank you very much the code is working very well now. You make it successful. I appreciate so much all your efort and sharing of knowledge.

Acctually all files are completed. I have test the codes in my friend's notebook last three month ago before I bought my notebook and it work without any problem. However, when I bought my own notebook and install linux then all this problem start to come out. By the way my friend is using suse 10 and I am using suse 9.3. I am not sure if that can make any different.

I have one concern to ask you. After add -lm to the makefile, there was only one warning appeared saying this:

/tmp/ccYaBtHR.o (.text+0X33): In function 'get_boolean':
util.c:warning: the 'gets' function is dangerouns and should not be used.

To avoid this warning what I do, I went to util.c file and comment out gets(line); then the program work very well. Any idea why this warning. Is possible to run the program without commenting out this line?

Again thank you very much
# 20  
Old 07-14-2006
Without seeing util.c I can't know what it's using gets for. gets reads a string from standard input, storing it as a character array terminated by a NULL character.

The problem with gets is that it takes an unlimited amount of input. It does not know how much space is available in the buffer. For instance:
Code:
#include <stdio.h>
int main()
{
  char buf[16];
  gets(buf);
  printf("You typed %s\n",buf);
  return(0);
}

If I typed "486193474587130958712057190856714890651618476" and hit enter, it would dump that entire string into that buffer of 16 bytes, which obviously isn't large enough to hold it. The remainder of it would get crammed into whatever bytes of memory trail after the buffer, which may be unused, or used for other variables, or part of the call stack, etc. When overflows like this happen they can be VERY hard to debug since by nature buffer overflows overwrite memory they're not supposed to. It's also a security risk -- if someone knows there's a buffer they can overflow, they can write to variables after it in memory, setting them to whatever values they want!

This is much safer:
Code:
#include <stdio.h>

int main()
{
  char buf[16];
  fgets(buf,16,stdin);
  printf("You typed %s\n",buf);
  return(0);
}

This will not overflow the buffer, it will only read a maximum of 15 bytes.
Login or Register to Ask a Question

Previous Thread | Next Thread

10 More Discussions You Might Find Interesting

1. UNIX for Beginners Questions & Answers

Print Error in Console and both Error & Output in Log file - UNIX

I am writing a shell script with 2 run time arguments. During the execution if i got any error, then it needs to redirected to a error file and in console. Also both error and output to be redirected to a log file. But i am facing the below error. #! /bin/sh errExit () { errMsg=`cat... (1 Reply)
Discussion started by: sarathy_a35
1 Replies

2. Solaris

Rpcinfo: can't contact portmapper: RPC: Authentication error; why = Failed (unspecified error)

I have two servers with a fresh install of Solaris 11, and having problems when doing rpcinfo between them. There is no firewall involved, so everything should theoretically be getting through. Does anyone have any ideas? I did a lot of Google searches, and haven't found a working solution yet. ... (2 Replies)
Discussion started by: christr
2 Replies

3. Shell Programming and Scripting

What is this error log = hda: irq timeout: error=0x00 and how to solve?

what is this error log = hda: irq timeout: error=0x00 and how to solve? every day upon checking the logs i see this error. hda: irq timeout: error=0x00 hda: irq timeout: error=0x00 hda: irq timeout: error=0x00 hda: irq timeout: error=0x00 hw_client: segfault at 0000000000000046 rip... (3 Replies)
Discussion started by: avtalan
3 Replies

4. UNIX for Dummies Questions & Answers

> 5 ")syntax error: operand expected (error token is " error

im kinda new to shell scripting so i need some help i try to run this script and get the error code > 5 ")syntax error: operand expected (error token is " the code for the script is #!/bin/sh # # script to see if the given value is correct # # Define errors ER_AF=86 # Var is... (4 Replies)
Discussion started by: metal005
4 Replies

5. UNIX for Advanced & Expert Users

ssh error: Error reading response length from authentication socket

Hi - I am getting the error `Error reading response length from authentication socket' when I ssh from my cluster to another cluster, and then back to my cluster. It doesn't seem to affect anything, but it's just annoying that it always pops up and tends to confuse new users of the cluster. I... (1 Reply)
Discussion started by: cpp6f
1 Replies

6. Solaris

fssnap error :snapshot error: File system could not be write locked

Hi Guys. This is part of my filesystem structure : Filesystem size used avail capacity Mounted on /dev/md/dsk/d0 47G 5.2G 42G 12% / /devices 0K 0K 0K 0% /devices ctfs 0K 0K 0K 0% ... (2 Replies)
Discussion started by: aggadtech08
2 Replies

7. AIX

nim mksysb error :/usr/bin/savevg[33]: 1016,07: syntax error

-------------------------------------------------------------------------------- Hello, help me please. I am trying to create a mksysb bakup using nim. I am geting this error, how to correct it ? : Command : failed stdout: yes stderr: no... (9 Replies)
Discussion started by: astjen
9 Replies

8. UNIX for Advanced & Expert Users

VSI-FAX error - Cannot login to server and Connecto error to host

I encounters a VSIFAX related error: vfxstat: Cannot login to server on rsac3: Connect error to host 172.16.1.45: Invalid argument It started happening last night with a core dump. Then we can't start VSIFAX again. I am runing VSI-FAX 4.2 on AIX box (0 Replies)
Discussion started by: b_jin
0 Replies

9. UNIX for Dummies Questions & Answers

awk Shell Script error : "Syntax Error : `Split' unexpected

hi there i write one awk script file in shell programing the code is related to dd/mm/yy to month, day year format but i get an error please can anybody help me out in this problem ?????? i give my code here including error awk ` # date-month -- convert mm/dd/yy to month day,... (2 Replies)
Discussion started by: Herry
2 Replies

10. UNIX for Dummies Questions & Answers

Error: Internal system error: Unable to initialize standard output file

Hey guys, need some help. Running AIX Version 5.2 and one of our cron jobs is writing errors to a log file. Any ideas on the following error message. Error: Internal system error: Unable to initialize standard output file I'm guessing more info might be needed, so let me know. Thanks (2 Replies)
Discussion started by: firkus
2 Replies
Login or Register to Ask a Question