Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Linking C++ static Library in C using gcc

Tags:

c++

c

gcc

g++

In the following code, I am trying to call a dummy function written in C++ (using C++ header files like ap_fixed.h, ap_int.h) from a C function. The code runs fine when I compile with g++. But when I use gcc for compiling test.c, it throws an error because I have included a C++ header file which is a valid error.

Is there any workaround to compile using gcc? I have read from some posts that it is not a good practice to merge C/C++ code in this manner. Please enlighten me if there are any serious repurcussions of working with a large C codebase and doing similar stuff.

Thanks

Header File: testcplusplus.h

#include "ap_fixed.h"
#include "ap_int.h"

#ifdef __cplusplus
extern "C" {
#endif

void print_cplusplus();

#ifdef __cplusplus
}
#endif

testcplusplus.cc

#include <iostream>
#include "testcplusplus.h"

void print_cplusplus() {

ap_ufixed<10, 5,AP_RND_INF,AP_SAT > Var1 = 22.96875; 
std::cout << Var1 << std::endl;
}

test.c

#include <stdio.h>
#include "testcplusplus.h"

int main() {
print_cplusplus();
}

Commands Used:

g++ -c -o testcplusplus.o testcplusplus.cc 
ar rvs libtest.a testcplusplus.o
gcc -o test test.c -L. -ltest

Error:

In file included from ap_fixed.h:21:0,
                 from testcplusplus.h:1,
                 from test.c:2:
ap_int.h:21:2: error: #error C++ is required to include this header file
like image 407
C Samuel Avatar asked Oct 01 '22 10:10

C Samuel


2 Answers

The problem here is that the C++ header ap_fixed.h is included from the C program test.c (indirectly via testcplusplus.h).

The solution is to remove the include of headers "ap_fixed.h" and "ap_int.h" from testcplusplus.h and include them directly from testcplusplus.cpp. The C program doesn't need to know about these anyway, only the C++ wrapper uses them directly.

In a larger example it might be appropriate to split testcplusplus.h into two headers: one that contains only declarations of the external interface you are presenting to the C environment, and another containing the rest - declarations needed internally in the C++ implementation and any required includes.

Once you have done this, you will still face linking errors because the executable that is produced will contain references to symbols from the C++ runtime libraries, plus any other libraries that your C++ code uses. To solve this, add -l directives when compiling the final executable, eg:

gcc -o test test.c -L. -ltest -lstdc++
like image 128
harmic Avatar answered Oct 03 '22 00:10

harmic


You do not need to include ap_int.h and ap_fixed.h at this point, as the declaration of the print_cplusplus function does not need those definitions.

Rather, include them in testcplusplus.c, so the C compiler can only see the C compatible interface of the C++ code.

like image 42
Simon Richter Avatar answered Oct 03 '22 01:10

Simon Richter