Programmer
Programmer

Reputation: 8687

Link an externally defined static function in C++ Application code

I have a set of pre defined C source code files that declares defines a lot of static functions - they are just coded up in .c files and not declared in any .h headers file.

Now I am trying to make use of those functions in my C++ application code:

Cmethods.c

static int amethod(int oppcheck)
{
}

A library is created using the C source code files:

$ nm --demangle userlib.a | grep amethod
00000000000001b6 t amethod

CppApp.h
extern "C" { int amethod(int oppcheck); }

CppApp.cpp
#include "CppApp.h"

voit callme()
{
amethod(check);
}

However during compilation ensuring that userlib.a is linked I get below error:

: undefined reference to `amethod'

$ nm --demangle userappcode.a | grep amethod
00000000000001b6 t amethod
                 U amethod

My further findings is that for functions in C source code files if declared in C header files - the linker error for them never occurs.

Note I cannot touch the C source code files - they are provided by third party community and we cannot break the license.

How can I resolve the issue

Upvotes: 0

Views: 692

Answers (4)

SoronelHaetir
SoronelHaetir

Reputation: 15164

you might not touch the C source but a hacky solution is to #include it into a different translation unit with functions that forward the statics. This is not something I would recommend as a general answer but ...

file1.c:

static void function1(int)
{ ...}

file2.c:

#include "file1.c"

void fwd_function1(int x)
{
  function1(x);
}

Upvotes: 0

I have a set of pre defined C source code files that declares defines a lot of static functions.

Now I am trying to make use of those functions in my C++ application code:

Remove the static from those functions you want to call from some other translation unit.

If you cannot do that, you can't use these functions from outside. And the compiler could even optimize them to the point of removing them from your object file.

(a dirty trick that I do not recommend could be to compile that C code with gcc -Dstatic= to have the preprocessor replace static by nothing)

Note I cannot touch the C source code files.

Then your task is impossible.

You could "augment" the translation units, perhaps by appending to them a public (non static) function calling the static one. For example, you might compile something like

// include the original C code with only `static` 
#include "Cmethods.c"
// code a public wrapper calling the static method
extern int public_amethod(int oppcheck);
int public_amethod(int oppcheck) { return amethod(oppcheck); }

Note I cannot touch the C source code files - they are provided by third party community and we cannot break the license -

It looks like you might not be legally allowed to compile that code, or that you cannot distribute its object file. There are no technical tricks to overcome a legal prohibition. If that goes in court, you'll probably lose!

Your issue is not technical, but social and legal. You may need a lawyer. You could also talk with the provider of the original code, and ask him if you are allowed to do what you want.

(without more motivation and context, your question looks weird)

Upvotes: 3

Francis
Francis

Reputation: 757

If you defined amethod with static, then the function will have a internal linkage which means you can't link this function from other source files.

internal linkage.

The name can be referred to from all scopes in the current translation unit. Any of the following names declared at namespace scope have internal linkage

variables, functions, or function templates declared static

non-volatile non-inline (sinceC++17) const-qualified variables (including constexpr) that aren'tdeclared extern and aren't previously declared to have external linkage.

data members of anonymous unions

Upvotes: 1

Milind Deore
Milind Deore

Reputation: 3063

static functions in C and static member functions in C++ are two different things. In C, a static function it is limited to its translation unit and invisible outside, this essential means object file(.o/.obj).

In C++, static can also apply to member functions and data members of classes. A static data member is also called a "class variable", while a non-static data member is an "instance variable".

Upvotes: 1

Related Questions