C++ linker presentation
This commit is contained in:
6
cpplinker/07_linker_errors/multiple_def/a.cpp
Normal file
6
cpplinker/07_linker_errors/multiple_def/a.cpp
Normal file
@@ -0,0 +1,6 @@
|
||||
#include <iostream>
|
||||
#include "shared.h"
|
||||
|
||||
void print_a() {
|
||||
std::cout << "a: globalVar = " << globalVar << "\n";
|
||||
}
|
||||
6
cpplinker/07_linker_errors/multiple_def/b.cpp
Normal file
6
cpplinker/07_linker_errors/multiple_def/b.cpp
Normal file
@@ -0,0 +1,6 @@
|
||||
#include <iostream>
|
||||
#include "shared.h"
|
||||
|
||||
void print_b() {
|
||||
std::cout << "b: globalVar = " << globalVar << "\n";
|
||||
}
|
||||
10
cpplinker/07_linker_errors/multiple_def/build.sh
Normal file
10
cpplinker/07_linker_errors/multiple_def/build.sh
Normal file
@@ -0,0 +1,10 @@
|
||||
#!/bin/bash
|
||||
|
||||
echo "=== This build SHOULD fail with 'multiple definition' ==="
|
||||
echo ""
|
||||
g++ -std=c++17 a.cpp b.cpp main.cpp -o app 2>&1 || true
|
||||
echo ""
|
||||
echo "Both a.o and b.o define globalVar because shared.h has a definition."
|
||||
echo ""
|
||||
echo "Fix 1: use 'extern int globalVar;' in header, define in one .cpp"
|
||||
echo "Fix 2: use 'inline int globalVar = 42;' (C++17)"
|
||||
8
cpplinker/07_linker_errors/multiple_def/main.cpp
Normal file
8
cpplinker/07_linker_errors/multiple_def/main.cpp
Normal file
@@ -0,0 +1,8 @@
|
||||
void print_a();
|
||||
void print_b();
|
||||
|
||||
int main() {
|
||||
print_a();
|
||||
print_b();
|
||||
return 0;
|
||||
}
|
||||
13
cpplinker/07_linker_errors/multiple_def/shared.h
Normal file
13
cpplinker/07_linker_errors/multiple_def/shared.h
Normal file
@@ -0,0 +1,13 @@
|
||||
#pragma once
|
||||
|
||||
// BUG: this is a definition, not just a declaration.
|
||||
// Including this header in multiple TUs causes "multiple definition" errors.
|
||||
int globalVar = 42;
|
||||
|
||||
// FIX (pick one):
|
||||
// 1. Use extern in header + define in one .cpp:
|
||||
// extern int globalVar; // in header
|
||||
// int globalVar = 42; // in one .cpp
|
||||
//
|
||||
// 2. Use inline (C++17):
|
||||
// inline int globalVar = 42;
|
||||
Reference in New Issue
Block a user