C++ linker presentation

This commit is contained in:
2026-02-24 10:21:15 +01:00
parent 0fda0d75fb
commit 6f3d98f388
32 changed files with 788 additions and 0 deletions

View File

@@ -0,0 +1,26 @@
#!/bin/bash
set -e
echo "=== Compile C++ wrapper ==="
g++ -std=c++17 -c wrapper.cpp -o wrapper.o
echo ""
echo "=== Compile C main ==="
gcc -std=c11 -c main.c -o main.o
echo ""
echo "=== Symbols in wrapper.o (note: unmangled due to extern C) ==="
nm -g wrapper.o | grep vec_
echo ""
echo "=== Symbols in main.o (C code references) ==="
nm -u main.o | grep vec_
echo ""
echo "=== Link (use g++ to pull in C++ runtime) ==="
g++ wrapper.o main.o -o app
echo "Created app"
echo ""
echo "=== Run ==="
./app

View File

@@ -0,0 +1,19 @@
#include <stdio.h>
#include "wrapper.h"
int main(void) {
void* vec;
vec_create(&vec);
vec_push(vec, 3.14);
vec_push(vec, 2.71);
vec_push(vec, 1.41);
printf("vector size: %d\n", vec_size(vec));
for (int i = 0; i < vec_size(vec); i++) {
printf(" [%d] = %.2f\n", i, vec_get(vec, i));
}
vec_destroy(vec);
return 0;
}

View File

@@ -0,0 +1,24 @@
#include "wrapper.h"
#include <vector>
extern "C" {
void vec_create(void** out) {
*out = new std::vector<double>();
}
void vec_destroy(void* vec) {
delete static_cast<std::vector<double>*>(vec);
}
void vec_push(void* vec, double val) {
static_cast<std::vector<double>*>(vec)->push_back(val);
}
double vec_get(void* vec, int idx) {
return (*static_cast<std::vector<double>*>(vec))[idx];
}
int vec_size(void* vec) {
return static_cast<std::vector<double>*>(vec)->size();
}
}

View File

@@ -0,0 +1,12 @@
#pragma once
#ifdef __cplusplus
extern "C" {
#endif
void vec_create(void** out);
void vec_destroy(void* vec);
void vec_push(void* vec, double val);
double vec_get(void* vec, int idx);
int vec_size(void* vec);
#ifdef __cplusplus
}
#endif