Неопределенные символы для архитектуры x86_64: & quot; _alloca & quot;

Я пытаюсь сделать проект Полимир но получаю ошибку при компиляции qt_clust.o

g++ -o bin/qt_clust .bld/qt_clust/tools/clustering/qt_clust.o -L/usr/lib -L/usr/local/lib -L/usr/include -lz -lgsl -lgslcblas -lgomp

и получить

"_alloca", referenced from:
__Z38find_valid_neighbors__measureNeighborsP7ClusterRSt6vectorIiSaIiEEP22GeneDistanceDeltaCacheP19PopulationPartition.omp_fn.4 in qt_clust.o
(maybe you meant: ParsedCluster* std::vector<ParsedCluster, std::allocator<ParsedCluster> >::_M_allocate_and_copy<__gnu_cxx::__normal_iterator<ParsedCluster const*, std::vector<ParsedCluster, std::allocator<ParsedCluster> > > >(unsigned long, __gnu_cxx::__normal_iterator<ParsedCluster const*, std::vector<ParsedCluster, std::allocator<ParsedCluster> > >, __gnu_cxx::__normal_iterator<ParsedCluster const*, std::vector<ParsedCluster, std::allocator<ParsedCluster> > >))
ld: symbol(s) not found for architecture x86_64
collect2: ld returned 1 exit status

Я уверен, что проблема с этим файлом: https://github.com/JaimieMurdock/polyworld/blob/master/tools/clustering/qt_clust.cpp

Я на OSX Mountain Lion.

0

Решение

Если вы изменили эти строки:

    float dists[clusterNeighborCandidates.size() - (i+1)];

compute_distances( distance_deltaCache,
neighborPartition->genomeCache,
clusterNeighborCandidates,
i, i+1, clusterNeighborCandidates.size(),
dists );

к этому:

    ::std::vector<float> dists(clusterNeighborCandidates.size() - (i+1));

compute_distances( distance_deltaCache,
neighborPartition->genomeCache,
clusterNeighborCandidates,
i, i+1, clusterNeighborCandidates.size(),
&(dists[0]) );

Могу поспорить, что проблема исчезнет.

Проблема в том, что исходный код имеет в стеке динамически изменяемый массив. Компилятор сгенерировал код, который вызывает «alloca» для выделения памяти из стека. К сожалению, эта функция нестандартна и в целом имеет не совсем понятную историю.

А массивы динамического размера, хотя и легальные C99, не являются легальными C ++ 03 или C ++ 11. Я думаю, что и g ++, и clang поддерживают их как расширение. Но, видимо, эта поддержка слегка нарушена под OS X.

::std::vector аккуратно обходит эту проблему. Он не выделяет массив в стеке. Он распределяет его по куче.

3

Другие решения

Других решений пока нет …