从 OSX 上的源代码构建 - C++
building from source on OSX - c++
我对 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
我读到,由于 clang
的新路径,在最新的 OSX
版本中构建 ITK
并不简单,并且应该设置这样的标志:CMAKE_CXX_FLAGS = -stdlib=libstdc++ -std=c++11
或 CMAKE_CXX_FLAGS = -stdlib=libstdc++ -std=c++03
但 none 有效。
有人可以帮忙吗?
你在库中得到了不应该存在的虚假符号。
官方的解决方法是使用较新版本的 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
- 编译器将其作为一个明显的错误。
有很多模板方法实例化混乱的问题,我在这里添加了一些参考:
第 657 行 Utilities/vxl/core/vnl/vnl_matrix_fixed_ref.h
添加一个 this->
前缀到 equal
的调用
第 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 行
SetNthInvocation
问题 Code/BasicFilters/itkBloxBoundaryPointImageToBloxBoundaryProfileImageFilter.txx
There are more, but they're a relatively tedious fix to get it to compile. I've put a pastebin of the diff up, which should be OK, although it was from a slightly unclean version so there may be some changes missing.
我放弃了修复它以使用 libc++
进行编译的尝试 - abs
的歧义问题是开始,可能还有更多,所以我觉得它不值得追求。
我对 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
我读到,由于 clang
的新路径,在最新的 OSX
版本中构建 ITK
并不简单,并且应该设置这样的标志:CMAKE_CXX_FLAGS = -stdlib=libstdc++ -std=c++11
或 CMAKE_CXX_FLAGS = -stdlib=libstdc++ -std=c++03
但 none 有效。
有人可以帮忙吗?
你在库中得到了不应该存在的虚假符号。
官方的解决方法是使用较新版本的 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
- 编译器将其作为一个明显的错误。
有很多模板方法实例化混乱的问题,我在这里添加了一些参考:
第 657 行 Utilities/vxl/core/vnl/vnl_matrix_fixed_ref.h
添加一个 this->
前缀到 equal
第 46、137 行的文件 Code/Common/itkParametricPath.txx
需要在 Evaluate
与 Code/Numerics/Statistics/itkWeightedCentroidKdTreeGenerator.txx
相同的问题,在第 120、126 行调用 GenerateTreeLoop
与 Code/BasicFilters/itkTernaryFunctorImageFilter.txx
相同的问题,在第 49、62 和 75 行调用 SetNthInput
与 Testing/Code/Common/itkMeshSourceGraftOutputTest.cxx
相同的问题,在调用 GraftOutput
SetNthInvocation
问题 Code/BasicFilters/itkBloxBoundaryPointImageToBloxBoundaryProfileImageFilter.txx
There are more, but they're a relatively tedious fix to get it to compile. I've put a pastebin of the diff up, which should be OK, although it was from a slightly unclean version so there may be some changes missing.
我放弃了修复它以使用 libc++
进行编译的尝试 - abs
的歧义问题是开始,可能还有更多,所以我觉得它不值得追求。