Practical Linking Examples
Project Structure and Linking Strategies
graph TD
A[Practical Linking Project] --> B[Header Files]
A --> C[Implementation Files]
A --> D[Main Program]
B --> E[Function Declarations]
C --> F[Function Implementations]
D --> G[Program Entry Point]
Example 1: Simple Calculator Library
Project Structure
calculator_project/
│
├── include/
│ └── calculator.h
├── src/
│ ├── add.c
│ ├── subtract.c
│ └── multiply.c
└── main.c
#ifndef CALCULATOR_H
#define CALCULATOR_H
int add(int a, int b);
int subtract(int a, int b);
int multiply(int a, int b);
#endif
Implementation Files
// add.c
#include "../include/calculator.h"
int add(int a, int b) {
return a + b;
}
// subtract.c
#include "../include/calculator.h"
int subtract(int a, int b) {
return a - b;
}
// multiply.c
#include "../include/calculator.h"
int multiply(int a, int b) {
return a * b;
}
Main Program: main.c
#include <stdio.h>
#include "include/calculator.h"
int main() {
int x = 10, y = 5;
printf("Addition: %d\n", add(x, y));
printf("Subtraction: %d\n", subtract(x, y));
printf("Multiplication: %d\n", multiply(x, y));
return 0;
}
Compilation Process
## Create object files
gcc -c -I./include src/add.c -o add.o
gcc -c -I./include src/subtract.c -o subtract.o
gcc -c -I./include src/multiply.c -o multiply.o
gcc -c -I./include main.c -o main.o
## Link object files
gcc add.o subtract.o multiply.o main.o -o calculator
Example 2: Static Library Creation
Library Creation Steps
## Compile object files
gcc -c -I./include src/add.c src/subtract.c src/multiply.c
## Create static library
ar rcs libcalculator.a add.o subtract.o multiply.o
## Compile main program with static library
gcc main.c -L. -lcalculator -I./include -o calculator
Linking Strategies Comparison
Linking Type |
Advantages |
Disadvantages |
Static Linking |
Complete dependency inclusion |
Larger executable size |
Dynamic Linking |
Smaller executable |
Runtime library dependency |
Modular Linking |
Improved code organization |
More complex compilation |
Advanced Linking Techniques
Conditional Compilation
#ifdef DEBUG
printf("Debug information\n");
#endif
Pragma Directives
#pragma once // Modern header guard
Error Handling in Linking
Common Linking Errors
- Undefined reference
- Multiple definition
- Library not found
Debugging Techniques
## Check symbol references
nm calculator
## Verify library dependencies
ldd calculator
Best Practices
- Use include guards in header files
- Minimize global variables
- Organize code into logical modules
- Use forward declarations
- Manage library dependencies carefully
At LabEx, we recommend practicing these linking techniques to build robust C applications.