Forum: Compiler & IDEs Eclipse includiert alle *.c dateien aus linked folder /lib


von Tom S. (tomsawer)


Angehängte Dateien:

Lesenswert?

Hallo!

Umgebung:

Linux Mint 64
Eclipse Indigo
AVR-GCC
AVR Eclipse Plugin

- Ich habe eine "AVR static Library" namens "lib" angelegt
- In diesem liegt eine tool.h und eine tool.cpp Datei
- Die tool.cpp Datei includiert den Header

---

In einem neuen "AVR Cross Target Platform" Projekt namens "Taiwan_board" 
packe ich "lib"-Ordner zu den C++ include directories und zu der "Source 
Location" (Siehe Foto)

--------

Das Problem:

Der Compiler kompiliert immer alle .cpp Dateien aus der externen /lib 
auch wenn ich die Header gar nicht includiere, also kein 'include 
<tool.h>

Dadurch werden MAKROS gesetzt und unnötiger Code erzeugt.

Mit der avr_libc funktioniert es ja auch, das nur kompiliert wird, was 
man auch benutzt.
Ich bin noch zu sehr ANfänger als das ich die Einstellung finde.. Hab 
Stunden gesucht.

Hier noch die makefile:
1
################################################################################
2
# Automatically-generated file. Do not edit!
3
################################################################################
4
5
-include ../makefile.init
6
7
RM := rm -rf
8
9
# All of the sources participating in the build are defined here
10
-include sources.mk
11
-include src/subdir.mk
12
-include library/subdir.mk
13
-include lib/Debug/subdir.mk
14
-include lib/subdir.mk
15
-include subdir.mk
16
-include objects.mk
17
18
ifneq ($(MAKECMDGOALS),clean)
19
ifneq ($(strip $(C++_DEPS)),)
20
-include $(C++_DEPS)
21
endif
22
ifneq ($(strip $(C_DEPS)),)
23
-include $(C_DEPS)
24
endif
25
ifneq ($(strip $(ASM_DEPS)),)
26
-include $(ASM_DEPS)
27
endif
28
ifneq ($(strip $(CC_DEPS)),)
29
-include $(CC_DEPS)
30
endif
31
ifneq ($(strip $(CPP_DEPS)),)
32
-include $(CPP_DEPS)
33
endif
34
ifneq ($(strip $(S_DEPS)),)
35
-include $(S_DEPS)
36
endif
37
ifneq ($(strip $(CXX_DEPS)),)
38
-include $(CXX_DEPS)
39
endif
40
ifneq ($(strip $(C_UPPER_DEPS)),)
41
-include $(C_UPPER_DEPS)
42
endif
43
ifneq ($(strip $(S_UPPER_DEPS)),)
44
-include $(S_UPPER_DEPS)
45
endif
46
endif
47
48
-include ../makefile.defs
49
50
# Add inputs and outputs from these tool invocations to the build variables 
51
LSS += \
52
Taiwan_BOard.lss \
53
54
FLASH_IMAGE += \
55
Taiwan_BOard.hex \
56
57
EEPROM_IMAGE += \
58
Taiwan_BOard.eep \
59
60
SIZEDUMMY += \
61
sizedummy \
62
63
64
# All Target
65
all: Taiwan_BOard.elf secondary-outputs
66
67
# Tool invocations
68
Taiwan_BOard.elf: $(OBJS) $(USER_OBJS)
69
  @echo 'Building target: $@'
70
  @echo 'Invoking: AVR C++ Linker'
71
  avr-g++ -Wl,-Map,Taiwan_BOard.map,--cref -mmcu=atmega128 -o "Taiwan_BOard.elf" $(OBJS) $(USER_OBJS) $(LIBS)
72
  @echo 'Finished building target: $@'
73
  @echo ' '
74
75
Taiwan_BOard.lss: Taiwan_BOard.elf
76
  @echo 'Invoking: AVR Create Extended Listing'
77
  -avr-objdump -h -S Taiwan_BOard.elf  >"Taiwan_BOard.lss"
78
  @echo 'Finished building: $@'
79
  @echo ' '
80
81
Taiwan_BOard.hex: Taiwan_BOard.elf
82
  @echo 'Create Flash image (ihex format)'
83
  -avr-objcopy -R .eeprom -O ihex Taiwan_BOard.elf  "Taiwan_BOard.hex"
84
  @echo 'Finished building: $@'
85
  @echo ' '
86
87
Taiwan_BOard.eep: Taiwan_BOard.elf
88
  @echo 'Create eeprom image (ihex format)'
89
  -avr-objcopy -j .eeprom --no-change-warnings --change-section-lma .eeprom=0 -O ihex Taiwan_BOard.elf  "Taiwan_BOard.eep"
90
  @echo 'Finished building: $@'
91
  @echo ' '
92
93
sizedummy: Taiwan_BOard.elf
94
  @echo 'Invoking: Print Size'
95
  -avr-size --format=avr --mcu=atmega128 Taiwan_BOard.elf
96
  @echo 'Finished building: $@'
97
  @echo ' '
98
99
# Other Targets
100
clean:
101
  -$(RM) $(OBJS)$(C_DEPS)$(EEPROM_IMAGE)$(ELFS)$(FLASH_IMAGE)$(LSS)$(S_DEPS)$(CXX_DEPS)$(S_UPPER_DEPS)$(C++_DEPS)$(ASM_DEPS)$(CC_DEPS)$(CPP_DEPS)$(C_UPPER_DEPS)$(SIZEDUMMY) Taiwan_BOard.elf
102
  -@echo ' '
103
104
secondary-outputs: $(LSS) $(FLASH_IMAGE) $(EEPROM_IMAGE) $(SIZEDUMMY)
105
106
.PHONY: all clean dependents
107
.SECONDARY:
108
109
-include ../makefile.targets

von Tom S. (tomsawer)


Lesenswert?

Es muss irgendeinen MEchanismus geben, der nur die .c und .cpp Dateien 
kompiliert, die man verwendet. Wie heißt das und wo findet man es?

von Dirk (Gast)


Lesenswert?

Hallo, such mal in den Projekteinstellungen (Projekt > re. Maustaste) 
nach "Include bzw. Exclude from build".

Grüße, Dirk

von Tom S. (tomsawer)


Lesenswert?

Danke Dirk!
Das geht schonmal

Alternativ könnte ich ja auch alle einzelnen libs in extraordner packen 
und nur das verwendete includen.

Was ist eleganter bzw. praktischer?
(Weiß ja nicht welche tricks noch alles dazu kommen :-) )

Grüße,
Tom

von Tom S. (tomsawer)


Lesenswert?

Dabei müsste ich immer eine neuen "AVR static library" erzeugen und kann 
nicht einfach nur den lib-Ordner angeben, da dieser ja sonst nicht weiß 
wo er die avr-libc findet ( z.b. #include <avr/io.h> ) Korrekt?

Das würde dann ne lange lisste an lib_X, lib_Y in meinem Workspace 
ergeben -> unschön.

Wie macht Ihr das?

von Tom S. (tomsawer)


Lesenswert?

Ok Habs jetzt halbwegs übersichtlich hinbekommen.

Alle libs liegen in eigenem Ordner und die in einem lib Ordner.

Nun muss ich zwar jede lib einzeln linken, aber der Aufwand geht schon 
i.o.
Dachte man kann sichs einfacher machen.

Wenn jemand nen hilfreichen link hat wo das mit dem ganzen includen und 
linken kurz und knapp erklärt wird, ich Freu mich!

mir fehlt leider auch das nötige Vokabular zum Suchen im Netz da ich 
autoditaktischer einzelkämpfer bin :-/

von Karl H. (kbuchegg)


Lesenswert?

Vorsicht:

Das was wir hier im Forum des öfteren eine Lib (Library) nennen, ist in 
Wirklichkeit keine. Daher auch der dich verblüffende Unterschied zur 
avr-libc.

die avr-libc ist bereits vorkompiliert und mit einem Tool, dem sog. 
Librarien in eine echte Library verpackt worden. Der Linker holt sich 
dann aus dieser Library die Teile, die er benötigt um das Programm 
fertig zu stellen.

Das ist aber etwas ganz anderes, als eine Sammlung von Source Code Files 
auf einem Directory. Die kann man zwar auch im weitesten Sinne eine 
Library nennen, eine Source Code Library, aber eigentlich versteht man 
im Build-Prozess unter einer Library etwas anderes - eine Sammlung von 
vorkompilierten Dingen, die mit dem Librarien zu einer Object Code 
Library zusammengefasst wurden.

von Kan a. (Firma: Basta) (kanasta)


Lesenswert?

Trotzdem gibts zur Library immer Include-Dateien,
in der (Funktions-)Definitionen festgehalten sind.

Ich glaube, Karl Heinz will ausdrücken, dass es
vorkompilierte als auch quelloffene Bibliotheken
gibt.

von Karl H. (kbuchegg)


Lesenswert?

Kan asta schrieb:
> Trotzdem gibts zur Library immer Include-Dateien,
> in der (Funktions-)Definitionen festgehalten sind.

Daran hatte ich in der Tat nicht mehr gedacht.
Danke für die Ergänzung.

von Tom S. (tomsawer)


Lesenswert?

Danke für die Infos! Muss es einfach verstehen bis in die Wurzel :-O

Für mich war das immer Quellcode, der irgendeine spezifische Funktion 
hat, meistens kleine Hardwaretreiber.

Das Projekt muss sich selbst noch als relativen Inklude-Pfad hinzufügen, 
damit dann lcd.h . . . lcd_cfg.h "sehen" kann.

Das habe ich mitlerweile glücklich am laufen :-):
1
Projekt
2
-----------------------
3
main.c:
4
    #include <lcd.h>
5
    ....
6
    ....
7
8
lcd_cfg.h:
9
    #define LCD_PORT  PORTD
10
    ....
11
    .....
1
library
2
-----------------------
3
lcd.h
4
    #include <lcd_cfg.h>
5
6
lcd.c
7
    mach was mit LCD_PORT


Da ich aus der lcd.h die Projektspezifische lcd_cfg.h inkludiere und 
diese fundamentale Infomationen enthält, kann ich den lcd-Quellcode ja 
nicht vorkompilieren. Richtig?

Wenns keine library ist, was ists dann? Keine Codeschnippsel mehr, oder?

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.