Kompilierung funktioniert mit gcc aber nicht mit g++
-
Hi,
ich versuche gerade ein Tool namens "GAUL" zum laufen zukriegen. In diesem Tool sind einige evolutionäre Algorithmen implementiert. Wenn ich jedoch die Bsp. Datein versuche zu kompilieren tritts folgendes auf
----------
1.) Unternutzung vongcc -I /usr/local/include/ -c wildfire_threat.c -o test.o
Und
gcc -g -O2 -Wall -o test2.out test.o -lgaul -lgaul_util -lm -lpthread -lslang -lmfunktioniert das Programm. Auch wenn ich folgende Kombination wähle:
*gcc -I /usr/local/include/ -c wildfire_threat.c -o test.o
g++ -g -O2 -Wall -o test2.out test.o -lgaul -lgaul_util -lm -lpthread -lslang -lm*
----------
Wenn ich jedoch 2.) folgendes mache:
*g++ -I /usr/local/include/ -c wildfire_threat.c -o test.o
g++ -g -O2 -Wall -o test2.out test.o -lgaul -lgaul_util -lm -lpthread -lslang -lm*
Erhalte ich folgende Fehlermeldungen:
----------
test.o: In function `wildfire_simulation(int*, bool)': wildfire_threat.c: (.text+0x52): undefined reference to `random_int(unsigned int)' wildfire_threat.c: (.text+0x74): undefined reference to `random_int(unsigned int)' test.o: In function `wildfire_score(population_t*, entity_t*)': wildfire_threat.c: (.text+0xb55): undefined reference to `ga_entity_set_fitness(entity_t*, double)' test.o: In function `wildfire_seed(population_t*, entity_t*)': wildfire_threat.c: (.text+0xb86): undefined reference to `random_boolean()' wildfire_threat.c: (.text+0xbb9): undefined reference to `random_boolean_prob(double)' wildfire_threat.c: (.text+0xc18): undefined reference to `random_int(unsigned int)' wildfire_threat.c: (.text+0xc25): undefined reference to `random_int(unsigned int)' wildfire_threat.c: (.text+0xc92): undefined reference to `random_int(unsigned int)' test.o: In function `wildfire_mutate_flip(population_t*, entity_t*, entity_t*)': wildfire_threat.c: (.text+0xd41): undefined reference to `random_int(unsigned int)' test.o: In function `wildfire_crossover(population_t*, entity_t*, entity_t*, entity_t*, entity_t*)': wildfire_threat.c: (.text+0xe25): undefined reference to `random_boolean()' wildfire_threat.c: (.text+0xe37): undefined reference to `random_int(unsigned int)' wildfire_threat.c: (.text+0xff0): undefined reference to `random_int(unsigned int)' test.o: In function `wildfire_ga_callback(int, population_t*)': wildfire_threat.c: (.text+0x11bc): undefined reference to `ga_get_entity_from_rank(population_t*, unsigned int)' wildfire_threat.c: (.text+0x11c4): undefined reference to `ga_entity_get_fitness(entity_t*)' wildfire_threat.c: (.text+0x11ef): undefined reference to `ga_population_score_and_sort(population_t*)' wildfire_threat.c: (.text+0x1206): undefined reference to `ga_fitness_mean_stddev(population_t*, double*, double*)' wildfire_threat.c: (.text+0x122b): undefined reference to `ga_get_entity_from_rank(population_t*, unsigned int)' wildfire_threat.c: (.text+0x1233): undefined reference to `ga_entity_get_fitness(entity_t*)' wildfire_threat.c: (.text+0x1268): undefined reference to `ga_get_entity_from_rank(population_t*, unsigned int)' wildfire_threat.c: (.text+0x1270): undefined reference to `ga_entity_get_fitness(entity_t*)' test.o: In function `main': wildfire_threat.c: (.text+0x12b0): undefined reference to `random_seed(unsigned int)' wildfire_threat.c: (.text+0x12dd): undefined reference to `ga_select_two_roulette_rebased(population_t*, entity_t**, entity_t**)' wildfire_threat.c: (.text+0x12e6): undefined reference to `ga_select_one_roulette_rebased(population_t*, entity_t**)' wildfire_threat.c: (.text+0x132e): undefined reference to `ga_genesis_integer(int, int, int, bool (*)(int, population_t*), bool (*)(int, entity_t*), void (*)(void*), void (*)(void*), bool (*)(population_t*, entity_t*), bool (*)(population_t*, entity_t*), entity_t* (*)(population_t*, entity_t*), bool (*)(population_t*, entity_t**), bool (*)(population_t*, entity_t**, entity_t**), void (*)(population_t*, entity_t*, entity_t*), void (*)(population_t*, entity_t*, entity_t*, entity_t*, entity_t*), void (*)(population_t*, entity_t*), void*)' wildfire_threat.c: (.text+0x135c): undefined reference to `ga_population_set_parameters(population_t*, ga_scheme_type_t, ga_elitism_type_t, double, double, double)' wildfire_threat.c: (.text+0x136d): undefined reference to `ga_evolution_threaded(population_t*, int)' wildfire_threat.c: (.text+0x137e): undefined reference to `ga_get_entity_from_rank(population_t*, unsigned int)' wildfire_threat.c: (.text+0x1386): undefined reference to `ga_entity_get_fitness(entity_t*)' wildfire_threat.c: (.text+0x13b5): undefined reference to `ga_get_entity_from_rank(population_t*, unsigned int)' wildfire_threat.c: (.text+0x1434): undefined reference to `ga_get_entity_from_rank(population_t*, unsigned int)' wildfire_threat.c: (.text+0x1528): undefined reference to `ga_extinction(population_t*)' collect2: ld returned 1 exit status
----------
Kann mir jemand dieses Phänomen erklären und vllt. einen tip geben wie ich gcc umgehen kann? (Der restlich Code den ich einbetten will, lässt sich nicht mit gcc kompilieren)
-
Da wird's um Name-Mangling gehen. Da Funktionsnamen in C++ überladen werden können, heißen die Symbole, die der C++-Compiler aus einer Funktionsdeklaration macht, anders als die, die ein C-Compiler daraus macht. wildfire_threat.c wird wohl einen Bibliotheks-Header einbinden, der nicht darauf vorbereitet ist, als C++ kompiliert zu werden.
Das lässt sich üblicherweise umgehen, indem man
extern "C" { #include "c_header.h" }
schreibt. Wenn man (aus welchen Gründen auch immer) nicht sicher ist, als was der Code nachher kompiliert werden soll, geht
#ifdef __cplusplus extern "C" { #endif #include "c_header.h" #ifdef __cplusplus } #endif
Das ist etwas, was man in vielen neueren C-Headern bereits findet, damit sie ohne diesen Schmu von C++-Code eingebunden werden können.
Aber warum willst du eine .c-Datei überhaupt als C++ kompilieren? Da ist kein C++-Code drin, also sollte das auch nicht durch einen C++-Compiler. Dein Vorhaben scheint mir nicht so richtig sinnvoll.
-
Großartig, dies löst mein Problem!
Danke!