不能使用g ++进行编译

现在我尝试使用一个名为“ GAUL ”的开源工具,其中实现了一些遗传algorithm。 通过编译示例文件,我发现我只能通过使用gcc而不是g ++来编译这些数据。 例如:


1)使用gcc -I /usr/local/include/ -c wildfire_threat.c -o test.o

gcc** -g -O2 -Wall -o test2.out test.o -lgaul -lgaul_util -lm -lpthread -lslang -lm

作品也是组合

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


但2)使用

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

我收到以下错误消息:

 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 

任何人都可以解释这个神秘的,我怎么可以避免使用GCC,因为这带来了剩余的我想embedded的源代码的问题?

您的第三方C库可能缺少头文件中的extern "C"声明。 要解决这个问题而不修改第三方头文件,你可以在你的C ++源代码中做这样的事情,无论你在哪里#include相关的第三方头文件:

 extern "C" { #include "gaul.h" // note: I'm just guessing the names of the #include "gaul_utils.h" // actual header files here... } 

您应该使用C编译器和C ++源代码编译C源代码。 在特定的情况下,GAUL库是用C编写的,它的头文件不适合包含在C ++编译中 – 它们缺少extern "C" ,因此当你编译为C ++时,函数是用C ++连接声明的,当然,不能在C编译的库中找到。