04-13-2004, 07:32 PM | #1 (permalink) |
Crazy
Location: The state of denial
|
[C and C++] Calling C++ function from c
Hello all,
I have a c program that is doing a few things with a MySQL database and I found a piece of code written in C++ to determine the amount of CPU usage on my machine. I would like to call the function written in C++ in my C program and then write this to the database, compiling goes fine until the linker fails saying: Linking... net_sql.obj : error LNK2001: unresolved external symbol _GetCpuUsage release/netsql.exe : fatal error LNK1120: 1 unresolved externals Error executing link.exe. Any idea why this is happening? Is there some way to do what I am trying to do? I'm using Microsoft Visual C++ 6. The Cpu usage code is not a lib or dll, just cpp files. |
04-13-2004, 08:40 PM | #2 (permalink) |
Location: Waterloo, Ontario
|
How well do you know C++?
In C++, it's possible to have two functions with exactly the same function names, as long as they have a different signature. A function's signature is its parameters, their types, and the order they're declared (this includes no parameters, as well). How this is implemented in C++ is that the function's name is modified in a determinisitic and canonical way, depending on it's parameters. This process is often called name mangling although, officially, the function name is said to be decorated. So, when your C linker goes looking into an object file made by your C++ compiler, it's looking for _GetCpuUage while the function has been "decorated" to something like _GetCpuUsage@@YA_NPAM@Z. To stop C++ from decorating your function name, you use the extern "C" keyword(s). So, in the C++ header, you'd export the function like this: Code:
extern "C" bool GetCpuUsage(float* percentage); Code:
extern "C" bool GetCpuUsage(float* percentage) {
	// your implementation, here...
} Actually, C++ programmers prefer to wrap the C++ function in a C function and export that so that they can both be used but I get the sense that you're not a C++ programmer, so this won't concern you. I hope you found this interesting and helpful--so, happy programming! |
04-13-2004, 09:09 PM | #3 (permalink) |
Crazy
Location: The state of denial
|
Thank you so much for your elequent explanation and solution. I'm actually a very decent programmer when it comes to C and Java, I haven't touched C++ in years. It didn't surprise me that C++ allows you to have same functions with different signitures, Java does that all the time. I just hadn't considered that the compiler was doing that to the function name and have never heard of having to extern a function in that way. Thanks again!
__________________
Smoke me a kipper, I'll be back for breakfast. |
Tags |
calling, function |
|
|