在OSX上从源代码构建 - c ++

时间:2015-09-03 10:11:21

标签: c++ macos vtk itk

我对c++几乎一无所知,我正在尝试从ITK上的源代码构建10.10 OSX工具。所以我严格遵循文档,当我尝试make时,我得到了一堆重复的错误

duplicate symbol ___sputc in:
    CMakeFiles/itktiff.dir/tif_aux.o
    CMakeFiles/itktiff.dir/tif_unix.o
ld: 69 duplicate symbols for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)
make[2]: *** [bin/libitktiff.3.16.0.dylib] Error 1
make[1]: *** [Utilities/itktiff/CMakeFiles/itktiff.dir/all] Error 2

我收到的信息为红色,例如Linking CXX shared library ../../../bin/libitkgdcm.dylib(红色表示错误?)

然后我到最后

[ 44%] Built target itkgdcm
make: *** [all] Error 2

我认为由于ITK的新路径,最新OSX版本中的clang版本并不简单,而且应该设置一个这样的标记: CMAKE_CXX_FLAGS = -stdlib=libstdc++ -std=c++11CMAKE_CXX_FLAGS = -stdlib=libstdc++ -std=c++03但没有效果。

有人可以帮忙吗?

1 个答案:

答案 0 :(得分:3)

你在图书馆里得到的虚假符号应该不存在。

官方解决方法是使用较新版本的ITK工具,但如果必须使用旧版本,则需要使用C选项#arrow-right { width: 50px; height: 350px; font-size: 26pt; font-weight: 900; text-align: center; line-height: 350px; position: relative; top: -365px; left: 124.95%; z-index: 3; cursor: pointer; } #arrow-left { width: 50px; height: 350px; font-size: 26pt; font-weight: 900; text-align: center; line-height: 350px; position: relative; top: -13px; left: 34.95%; z-index: 3; cursor: pointer; } 进行配置,以使内联的行为方式与应该让这项工作。

OSX附带两个c ++库 - 一个clang默认为-std=gnu89,一个官方gcc默认为libc++,如果您正在编译多个C ++项目以构建到最终target,那么你必须确保它们都使用相同的C ++标准库进行编译。

假设您已计划与libstdc++进行关联,因为您已经指明了这一点,我已按照以下方式更新了编译说明:

这意味着您应该使用以下选项运行clang:

libstdc++

文件cmake -DBUILD_SHARED_LIBS=true -DCMAKE_C_FLAGS=-std=gnu89 -DCMAKE_CXX_FLAGS="-stdlib=libstdc++ -std=c++03" CMakeLists.txt 有几个对Code/Common/itkKLMSegmentationBorder.h的引用,它应该是rhs.m_Pointer - 编译器使这成为一个明显的错误。

有很多模板方法实例混淆问题,我在这里添加了一些参考文献:

rhs->m_Pointer中的第657行为调用Utilities/vxl/core/vnl/vnl_matrix_fixed_ref.h

添加this->前缀

第46,137行的文件equal需要添加一个 - >在所有Code/Common/itkParametricPath.txx

的调用之前

Evaluate相同的问题,在第120行,第126行,调用Code/Numerics/Statistics/itkWeightedCentroidKdTreeGenerator.txx

GenerateTreeLoop相同的问题,在第49,62行和第49行75调用Code/BasicFilters/itkTernaryFunctorImageFilter.txx

SetNthInput相同的问题,在调用Testing/Code/Common/itkMeshSourceGraftOutputTest.cxx

的第153行

GraftOutputSetNthInvocation

有关的问题
  

还有更多,但它们是一个相对乏味的修复程序,可以让它编译。我已经放了pastebin of the diff up,这应该没问题,虽然它来自一个稍微不干净的版本,所以可能会遗漏一些变化。

我放弃了尝试修复使用Code/BasicFilters/itkBloxBoundaryPointImageToBloxBoundaryProfileImageFilter.txx进行编译 - libc++的歧义问题是开始,可能还有更多,所以我感觉不到值得追求。