2015-09-03 2 views
2

Я почти ничего не знаю от c++ и пытаюсь построить ITK инструмент из источника на 10.10 OSX. Так что я следовал строго док, когда я пытаюсь make я получаю, кучу повторяющихся ошибокздание из источника на OSX - C++

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 «s, и что один должен установить флаг так: CMAKE_CXX_FLAGS = -stdlib=libstdc++ -std=c++11 или CMAKE_CXX_FLAGS = -stdlib=libstdc++ -std=c++03, но никто не работал.

Может кто-нибудь помочь?

+0

Хм ... никогда не было денег, чтобы позволить MAC ... но ... MAC - это своего рода BSD-based. А под BSD обычно стандартными libs не являются libstdC++, а libC++, если я не ошибаюсь. – BitTickler

+0

@BitTickler ok давайте попробуем – Newben

+0

@BitTickler теперь я получаю ошибку «раньше» 'ошибка: недопустимые операнды в двоичное выражение ('std :: ofstream' (aka 'basic_ofstream ') и 'long') if (* fp == NULL) ' – Newben

ответ

3

Вы получаете ложные символы в библиотеке, которых не должно быть.

Официальное обходное решение заключается в использовании более новой версии инструментов ITK, но если вам нужно использовать более старую версию, то вам нужно настроить с помощью опции C -std=gnu89, чтобы сделать inlining таким образом, чтобы это сделать Работа.

OSX поставляется с двумя библиотеками C++ - тот, который лязг по умолчанию для libc++ и один, что официальный ССАГПЗ по умолчанию libstdc++, если вы собираете множественные C++ проектов для создания на конечной цель, то вы должны убедиться, что они все скомпилируются с той же стандартной библиотекой C++.

В предположении, что вы планируете на связь с 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 - компилятор делает это очевидная ошибка.

Там много вопросов путаницы шаблонный метод instantion, я добавил несколько ссылок здесь:

линии 657 в Utilities/vxl/core/vnl/vnl_matrix_fixed_ref.h добавить this-> префикс к вызову equal

В файле Code/Common/itkParametricPath.txx на линиях 46, 137 необходим дополнительный этом-> перед всеми вызовами Evaluate

же вопрос с Code/Numerics/Statistics/itkWeightedCentroidKdTreeGenerator.txx, в строках 120, 126 с вызовами GenerateTreeLoop

Тот же вопрос с Code/BasicFilters/itkTernaryFunctorImageFilter.txx, в строках 49, 62 & 75 с вызовом SetNthInput

Та же проблема с Testing/Code/Common/itkMeshSourceGraftOutputTest.cxx, в строке 153 в вызове 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++ - вопросы двусмысленности wi th abs было началом, и, вероятно, больше, поэтому я не чувствую, что это стоит того.

Смежные вопросы