In a directory by itself, create this file:
Then compile and run it like this:
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:
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:
Then, modify main.c to use it like this:
Finally, let's see what happens when we try and compile it, then link it:
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.
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:
With that makefile in the main directory, let's try it:
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.
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..
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
Don't call people 'dear' unless you're married to them.
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
it should do
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:
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.
Don't call people 'dear' unless you're married to them.
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
it should do
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:
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.
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?
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:
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:
This will not overflow the buffer, it will only read a maximum of 15 bytes.
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)
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)
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)
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)
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)
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)
--------------------------------------------------------------------------------
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)
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)
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)
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)