Tilted Forum Project Discussion Community

Tilted Forum Project Discussion Community (https://thetfp.com/tfp/)
-   Tilted Technology (https://thetfp.com/tfp/tilted-technology/)
-   -   [C and C++] Calling C++ function from c (https://thetfp.com/tfp/tilted-technology/52355-c-c-calling-c-function-c.html)

madcow 04-13-2004 07:32 PM

[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.

KnifeMissile 04-13-2004 08:40 PM

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);
...and in your C++ source file, you'd have something like:
Code:

extern "C" bool GetCpuUsage(float* percentage) {&#10&#9// your implementation, here...&#10}
The function name GetCpuUsage won't get "mangled" and your C linker should be able to find it.

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!

madcow 04-13-2004 09:09 PM

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!


All times are GMT -8. The time now is 09:14 AM.

Powered by vBulletin® Version 3.8.7
Copyright ©2000 - 2025, vBulletin Solutions, Inc.
Search Engine Optimization by vBSEO 3.6.0 PL2
© 2002-2012 Tilted Forum Project


1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76