makefile & include problems

Can someone please shed light onto the following problem I am having.


If I use the makefile from assignment#1 even simple
things fail.e.g.

#include <string.h>
#include <stdlib.h>

void useless()
{
    char * x = strdup("hello");
    free(x);
}

/usr/bin/g++ -Wall -ansi -c -g -I./ -I/usr/include -I/usr/include -I/usr/incl
-o Test.o Test.cpp
Test.cpp: In function `void useless()':
Test.cpp:6: : implicit declaration of function `int strdup(...)'
Test.cpp:6: : initialization to `char *' from `int' lacks a cast

The problem appears to be when using the C functions from C++

Is there a way to bypass or fix?
izomaxAsked:
Who is Participating?
I wear a lot of hats...

"The solutions and answers provided on Experts Exchange have been extremely helpful to me over the last few years. I wear a lot of hats - Developer, Database Administrator, Help Desk, etc., so I know a lot of things but not a lot about one thing. Experts Exchange gives me answers from people who do know a lot about one thing, in a easy to use platform." -Todd S.

van_dyCommented:
see if  this works

extern "C" {
        char *strdup(const char*);
}

void useless()
{
    char * x = strdup("hello");
    free(x);
}

#g++ -Wall -ansi -c -g -I./ -I/usr/include -I/usr/include -I/usr/incl -o Test.o Test.cpp  -lc

hope this helps
van_dy
0
ravs120499Commented:
Check string.h - it should have something like this at the top of the file:

#ifdef __cplusplus
  extern "C" {
#endif

and at the end of the file:

#ifdef __cplusplus
}
#endif

If it doesn't work, looks like you have a non-C++ aware include directory. So try this in your source file:

extern "C" {
#include <string.h>
}

(Not certain this will work, but give it a shot.)

If this too doesn't work, then I can't think of any other way than to hand-roll every function prototype you need with an extern "C", as van_dy has written.

- Ravs
0
van_dyCommented:
ravs' solution will work, in case you
have the problem i am thinking(c headers
not written with __cplusplus define gaurds)
0
Peter-DartonCommented:
It looks like your source code is in "test.cpp" whereas you're actually writing C, not C++, so "test.c" would be more appropriate.

You may find that if you rename test.cpp as test.c, the compiler will understand that it really is C code it's building, not C++.

Note: Depending on the link method used in the makefile, this might then lead to issues at the link stage, if the link method is written to only cope with C++ as you'll be linking C code, hence "main" won't be a mangled name.  That can either be dealt with by having a C++ main method (in a .cpp file) instead, or by telling the makefile and/or linker that you're using C not C++.
0

Experts Exchange Solution brought to you by

Your issues matter to us.

Facing a tech roadblock? Get the help and guidance you need from experienced professionals who care. Ask your question anytime, anywhere, with no hassle.

Start your 7-day free trial
It's more than this solution.Get answers and train to solve all your tech problems - anytime, anywhere.Try it for free Edge Out The Competitionfor your dream job with proven skills and certifications.Get started today Stand Outas the employee with proven skills.Start learning today for free Move Your Career Forwardwith certification training in the latest technologies.Start your trial today
Web Languages and Standards

From novice to tech pro — start learning today.

Question has a verified solution.

Are you are experiencing a similar issue? Get a personalized answer when you ask a related question.

Have a better answer? Share it in a comment.