Ich persönlich würde CMake verwenden.
Diese Art von Problem wird ein ewiger Begleiter sein, zumindest könnte ich siebzehn Lieder davon singen, dass man irgendwelche Include, Lib, etc. Probleme hat in C und C++... da geht gerne genauso viel Zeit flöten, wie für's herkömmliche Debuggen. Vielleicht war ich auch einfach nur unfähig... 32-bit, 64-bit, debug, release, static, shared, hier ein Pfad, usw. usw. ich vermisse es nicht...
// ./src/main.c
#include <stdio.h>
#include <test/test.h>
int main() {
printf("2*2 = %d\n", my_square(2));
}
// ./include/test/test.h
#ifndef INCLUDE_TEST_H
#define INCLUDE_TEST_H
int my_square(int x);
#endif // INCLUDE_TEST_H
// ./src/test/test.c
#include <test/test.h>
int my_square(int x) {
return x * x;
}
# Compile object file from test:
gcc -c -o ./build/test/test.o -I./include/ ./src/test/test.c
# Create static library file:
ar rcs ./lib/test/libtest.a ./build/test/test.o
# Compile and link main program with libtest:
gcc -I./include/ -L./lib/test ./src/main.c -ltest -o ./build/main
# Run main:
./build/main
2*2 = 4
# Directory structure:
.
|-build
| |-main
| |-test
| | |-test.o
|-include
| |-test
| | |-test.h
|-lib
| |-test
| | |-libtest.a
|-src
| |-main.c
| |-test
| | |-test.c
# Adding another lib as dependency to libtest
mkdir include/magic
touch include/magic/magic.h
mkdir src/magic
touch src/magic/magic.c
mkdir lib/magic
mkdir build/magic
// ./include/magic/magic.h
#ifndef INCLUDE_MAGIC_H
#define INCLUDE_MAGIC_H
int get_magic();
#endif // INCLUDE_MAGIC_H
// ./src/magic/magic.c
#include <magic/magic.h>
int get_magic() {
return 0xDEADBEEF;
}
// ./include/test/test.h
#ifndef INCLUDE_TEST_H
#define INCLUDE_TEST_H
int my_square(int x);
int magic_mul(int x);
#endif // INCLUDE_TEST_H
// ./src/test/test.c
#include <test/test.h>
#include <magic/magic.h>
int my_square(int x) {
return x * x;
}
int magic_mul(int x) {
return x * get_magic();
}
// ./src/main.c
#include <stdio.h>
#include <test/test.h>
int main() {
printf("2*2 = %d\n", my_square(2));
printf("3*'magic' = %d\n", magic_mul(3));
}
# Create libmagic, libtest, compile main
gcc -c -o ./build/magic/magic.o -I./include/ ./src/magic/magic.c
ar rcs ./lib/magic/libmagic.a ./build/magic/magic.o
gcc -c -o ./build/test/test.o -I./include/ ./src/test/test.c
ar rcs ./lib/test/libtest.a ./build/test/test.o
gcc -I./include/ -L./lib/test -L./lib/magic ./src/main.c -ltest -lmagic -o ./build/main
./build/main
2*2 = 4
3*'magic' = -1677116211
# Directory structure:
.
|-build
| |-magic
| | |-magic.o
| |-main
| |-test
| | |-test.o
|-include
| |-magic
| | |-magic.h
| |-test
| | |-test.h
|-lib
| |-magic
| | |-libmagic.a
| |-test
| | |-libtest.a
| | |-libtest2.a
|-src
| |-magic
| | |-magic.c
| |-main.c
| |-test
| | |-test.c
D. h., die Libs müssen nicht untereinander verlinkt werden, sondern das passiert alles zusammen beim Linken des Hauptprogramms.
Oder in diesem Fall natürlich einfach, eine einzige lib:
ar rcs ./lib/test/libtest2.a ./build/test/test.o ./build/magic/magic.o
gcc -I./include/ -L./lib/test ./src/main.c -ltest2 -o ./build/main
Oder in diesem Fall natürlich noch einfacher, gar keine lib:
gcc -I./include ./src/main.c ./src/test/test.c ./src/magic/magic.c -o ./build/main