The following set of code present a fully functioning example of using a simple CPP library as part of a C based project to print on screen.
[download id=”2428″]
The trick relies on encapsulating the CPP header definitions in the extern "C" declaration. extern "C" will make all function and variable names in C++ have C linkage. What this means at the compiler level is that the compiler will not modify the names so that the C code can link to them and use them using a C compatible header file containing just the declarations of your functions and variables.
[download id=”2428″]
main.c
#include "cpp_library.h"
#include "c_library.h"
int main() {
cpp_hello_world();
c_hello_world();
return 0;
}
cpp_library.h
#ifndef C_BASE_CPP_LIBRARY_H
#define C_BASE_CPP_LIBRARY_H
#ifdef __cplusplus
extern "C" {
#endif
void cpp_hello_world();
#ifdef __cplusplus
}
#endif
#endif //C_BASE_CPP_LIBRARY_H
cpp_library.cpp
#include <iostream>
#include "cpp_library.h"
void cpp_hello_world() {
std::cout << "Hello, World!" << std::endl;
}
c_library.h
#ifndef C_BASE_C_LIBRARY_H #define C_BASE_C_LIBRARY_H void c_hello_world(); #endif //C_BASE_C_LIBRARY_H
c_library.c
#include <stdio.h>
#include "c_library.h"
void c_hello_world() {
printf("Hello, World!\n");
}
CMakeLists.txt
cmake_minimum_required(VERSION 3.6)
project(C_Base)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11")
set(SOURCE_FILES main.c cpp_library.cpp cpp_library.h c_library.c c_library.h)
add_executable(C_Base ${SOURCE_FILES})
[download id=”2428″]
This post is also available in: Greek


