0

我正在尝试制作项目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 上。

4

1 回答 1

3

如果您更改了这些行:

    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巧妙地回避了这个问题。它不会在堆栈上分配数组。它在堆上分配它。

于 2013-01-12T02:13:08.627 回答