1. This site uses cookies. By continuing to use this site, you are agreeing to our use of cookies. Learn More.

Compiling and Running Questions with CC and GCC

Discussion in 'Userland Programming and Scripting' started by contraversy, May 1, 2012.

  1. contraversy

    contraversy New Member

    Messages:
    34
    Likes Received:
    0
    Hello!

    I have done a lot of programming in Windows, and have never spent much time with UNIX/Linux. I installed FreeBSD to set up a shell and web server and have fallen in love! So on to my questions, I tossed together a quick program just to test out how to compile and run in UNIX:
    Code:
    #include </usr/include/stdio.h>
    
    int main()
    { 
        printf("Hello FreeBSD!");
        return 0;
    }
    
    After that I searched for how to compile and found two options it seems. I can use CC or GCC, which leads to my question: is one actually better than the other for compiling console based applications? I compiled it with this command:
    Code:
    cc -o hello main.c
    
    After spending a few minutes with this I found that I have to run the program using "./hello" instead of just "hello". Why is this? The only reason I can assume is that there is already a "hello" program in the system, but when compiled under "m33valhx" it still requires "./"

    I will continue searching for this answer, but I am at work and may hear the answer faster through this post.

    Thanks!
     
  2. anon12b

    anon12b New Member

    Messages:
    17
    Likes Received:
    0
    Hi, glad you are enjoying FreeBSD.

    cc(1) is exactly the same program as gcc(1), currently. The name cc just means C compiler, and is where you would expect the C compiler under a Unix-like system. gcc is a specific implementation of the C compiler (and a bit more, but there is no need to worry about that yet).

    The reason you have to use ./hello is because the current directory is not in your PATH. Your PATH determines where the shell will look, when you do not provide a complete description of what you intend to run. There is a similar implementation under Windows, which is why you can just run, for example, cmd.exe, instead of having to find it in whatever folder it is in (I cannot remember).
     
  3. contraversy

    contraversy New Member

    Messages:
    34
    Likes Received:
    0
    Ok, I understand you. When I was setting up BASH and the rest of my server I ran into that same issue. So when I get a final build of my application I can just add it to my path. Thanks a ton!
     
  4. xnl96

    xnl96 New Member

    Messages:
    48
    Likes Received:
    0
    Because you have not set the environment variable PATH set for your program. You can view this variable
    Code:
    int main(int argc,char** argv,char** envp){ 
    while(*envp){
    printf("%s\n",*envp);
    envp++;}}
     
  5. UNIXgod

    UNIXgod New Member

    Messages:
    1,089
    Likes Received:
    0
    Code:
    #include <stdio.h>
    will work just fine. You can also use make. Look into setting up clang as your cc.

    Example:
    https://forums.freebsd.org/showthread.php?t=30851

    To see your paths look you can

    % echo $PATH
    To set path say to a bin dir inside your home directory:
    % PATH=$PATH:$HOME/bin
    To make it persistent use your shell's rc file.

    It may be worth reading man hier(7) for future reference.
     
  6. contraversy

    contraversy New Member

    Messages:
    34
    Likes Received:
    0
    Ok, maybe I missed something. When I tried
    Code:
    #include <stdio.h>
    it wouldn't compile, I had to use the 'find' command to get its location. Are you saying to add /usr/include/ to the path? Or use
    Code:
    #include <stdio.h>
    and compile it with make?
     
  7. anon12b

    anon12b New Member

    Messages:
    17
    Likes Received:
    0
    What was the error when you compiled with just, <stdio.h>?
     
  8. matoatlantis

    matoatlantis Member

    Messages:
    532
    Likes Received:
    0
    Not sure why so complicated here; to check the PATH variable in shell you can simply do:

    $ echo $PATH

    Or even to check all environment variables:

    $ env

    This is the equivalent of Windows command "set" that can be launched from command line (cmd.exe).

    Depending what you used on Windows (what kind of IDE), similar logic is used when compiling programs under Unix. Makefile is your friend, look for make(1) man page; you can find some quick tutorials how to create your own Makefiles on Google too.

    Strange you have to specify full path in #include directives for standard header files. How did you install gcc? Pasting error would be helpful too.
     
  9. contraversy

    contraversy New Member

    Messages:
    34
    Likes Received:
    0
    Well, a moderator is following me around because of punctuation. He changed the typing of one of my commands but I am unable to edit the post to fix it. Kind of redundant on his part so I'm sorry since he created an error while "fixing" my punctuation.

    As far as my issue goes, consider it resolved. After making the addition to my PATH, I can compile my program without having to list the entire path to the header file.

    But to answer your question about how it was installed, I just downloaded and burned FreeBSD 9 onto a DVD and installed everything I could off of it. Also used:
    Code:
     # portsnap fetch 
     
  10. SirDice

    SirDice Moderator Staff Member Moderator

    Messages:
    17,392
    Likes Received:
    7
    This has nothing to do with PATH. PATH is only used when looking for executables to run.
     
  11. ondra_knezour

    ondra_knezour Member

    Messages:
    454
    Likes Received:
    1
    Just side note:
    The portsnap utility will fetch actual ports() collection, you have to extract it for first time with # portsnap extract and in next fetch run, you will be just updating it. Commands can be chained like # portsnap fetch extract
     
  12. contraversy

    contraversy New Member

    Messages:
    34
    Likes Received:
    0
    Yes, the tutorial I was following had me use the fetch and extract commands. It works now thank you all.