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

building from source on OSX - c++

本文关键字:源代码 构建 c++ OSX      更新时间:2023-10-16

我几乎对c++一无所知,我正试图从10.10 OSX的源代码构建ITK工具。所以我严格遵循文档,当我尝试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

我读到在最新的OSX版本中构建ITK并不简单,因为clang的新路径,并且应该设置这样的标志:CMAKE_CXX_FLAGS = -stdlib=libstdc++ -std=c++11CMAKE_CXX_FLAGS = -stdlib=libstdc++ -std=c++03,但没有工作。

有人能帮忙吗?

你在库中得到了不应该存在的虚假符号。

官方的解决方法是使用较新版本的ITK工具,但是如果你必须使用旧版本,那么你需要配置C选项-std=gnu89以使内联按照应该的方式工作。

OSX附带了两个c++库- clang默认为libc++的一个和官方gcc默认为libstdc++的一个,如果你要编译多个c++项目来构建最终目标,那么你必须确保它们都使用相同的c++标准库编译。

假设您计划与libstdc++链接,正如您所指示的那样,我已经更新了编译指令如下:

这意味着你应该运行clang选项:

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 -编译器使这是一个明显的错误。

有很多模板方法实例混淆的问题,我在这里添加了一些引用:

Utilities/vxl/core/vnl/vnl_matrix_fixed_ref.h中的第657行为equal的调用添加this->前缀

第46、137行文件Code/Common/itkParametricPath.txx需要在Evaluate

的所有调用之前添加this->

Code/Numerics/Statistics/itkWeightedCentroidKdTreeGenerator.txx也有同样的问题,在第120行和126行调用GenerateTreeLoop

Code/BasicFilters/itkTernaryFunctorImageFilter.txx相同,在第49行,第62行&75与SetNthInput的调用

Testing/Code/Common/itkMeshSourceGraftOutputTest.cxx也有同样的问题,在GraftOutput

调用的第153行

SetNthInvocationCode/BasicFilters/itkBloxBoundaryPointImageToBloxBoundaryProfileImageFilter.txx的问题

还有更多,但它们是一个相对乏味的修复,以使其能够编译。我已经粘贴了diff,应该没问题,虽然它来自一个稍微不干净的版本,所以可能会有一些变化缺失。

我放弃了尝试修复它与libc++的编译- abs的歧义问题是开始,可能还有更多,所以我觉得不值得追求