我正在尝试使项目polyworld,但是在编译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上。
最佳答案
如果您更改了以下几行:
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
巧妙地避开了这个问题。它不会在堆栈上分配数组。它在堆上分配它。