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