Dismiss Notice
Join Physics Forums Today!
The friendliest, high quality science and math community on the planet! Everyone who loves science is here!

Problem with C programming

  1. Jul 25, 2008 #1
    So I am trying to write a program in C including simple mathematical functions given in math.h. In particular, I want sin(), cos() and pow(). Now when I try to compile (using gcc), I get this error (using powf()):

    Undefined first referenced
    symbol in file
    powf /var/tmp/ccbfbDve.o
    ld: fatal: Symbol referencing errors. No output written to a.out
    collect2: ld returned 1 exit status

    Any help?
     
  2. jcsd
  3. Jul 25, 2008 #2
    Could you post your code?
     
  4. Jul 25, 2008 #3

    mgb_phys

    User Avatar
    Science Advisor
    Homework Helper

    You are on unix, are you using gcc?
    Did you remember to link the maths library with '-lm'
     
  5. Jul 25, 2008 #4
    I am on an ssh with a linux. I don't know what it means to link -lm. My actual code is way too long so I'll send an example which gives the same problem:

    #include <stdio.h>
    #include <math.h>

    main ()
    {
    printf("%f\n", powf(2.0, 3.0));
    }
     
  6. Jul 25, 2008 #5

    Dale

    Staff: Mentor

    "ld:" indicates a linking error, not a compilation error. There is nothing wrong with your code, you just aren't linking to the math library. You need to fix your makefile.
     
  7. Jul 25, 2008 #6

    mgb_phys

    User Avatar
    Science Advisor
    Homework Helper

    The compiler converts your .c file into a binary .obj file
    The linker then converts this into an executable (a.out on linux) including any other system code to do things like maths functions.
    GCC calls the linker automatically so you might never see the link command.
    For various technical reasons the maths lib is special (eg. you might have different version for speed or precision) and so you have to tell GCC to use it explicity.

    Basically just type the same gcc command line as before, but put '-lm' on the end of the line.
     
  8. Jul 26, 2008 #7
    Yes, I learned this when I took a C programming class and was very confused when my code compiled fine in windows but would return an error on Solaris. It compiled fine using g++. The CS professor pointed out that you need to use the -lm switch to properly link the math library in gcc.
     
  9. Jul 26, 2008 #8
    Not necessarily true. For instance, a quick straw poll of the five machines in the room I'm sitting in right now (an iBook G4, a MacBook Pro, two Core2 Duo desktops, and a rather menacing Itanium-toting thing, all running either OS X or Debian) shows me that three of them -- the macs and one of the Core2 Duos -- will compile quite happily without passing '-lm' upon linking. All run various versions of gcc 3.x or 4.x.

    I've never quite been able to figure out if there's a good reason why some compilers on some machines can automagically handle '-lm' linking, whereas others can't. If anyone can point out why this is so I'd be grateful.
     
    Last edited: Jul 26, 2008
  10. Jul 27, 2008 #9

    jim mcnamara

    User Avatar
    Science Advisor
    Gold Member

    Code (Text):

    gcc mfile.c -o myfile -lm
     
    The -lm part means go to /lib and find a shared library name libm. Link any unresolved symbols against it.
     
  11. Jul 27, 2008 #10
    On the machines that work, there is probably an environment variable (something like CFLAGS or CPPFLAGS) that implicitly passes the '-lm' flag to gcc.
     
Know someone interested in this topic? Share this thread via Reddit, Google+, Twitter, or Facebook

Have something to add?