2014-10-19 2 views
10

나는 다음과 같은 상황이있어 :"Template Haskell + C"버그의 해결 방법은 무엇입니까?

  • Library X
  • Library A이 라이브러리 X.에 따라 C에서 일부 코드에 대한 래퍼입니다
  • Library B는 템플릿 하스켈 사용 및 라이브러리 A.에 따라

GHC bug #9010은 GHC 7.6을 사용하여 라이브러리 B를 설치할 수 없습니다. TH가 처리 될 때까지 GHCi은 화재 및

Loading package charsetdetect-ae-1.0 ... linking ... ghc: 
~/.cabal/lib/x86_64-linux-ghc-7.6.3/charsetdetect-ae-1.0/ 
libHScharsetdetect-ae-1.0.a: unknown symbol `_ZTV15nsCharSetProber' 

같은 메시지 ('알 심볼 "의 실제 이름 시스템마다 다르다) 실패 X 라이브러리를로드하려고.

물론이 문제에 대한 해결 방법이 있습니까 (물론 "템플릿 하스켈을 사용하지 마십시오"와 별도)? 어쩌면 라이브러리 X는 다르게 컴파일되어야합니다. 또는로드를 막을 수있는 방법이 있습니다 (어쨌든 코드 생성 중에 호출해서는 안됨)?

+0

가 libyourlibname.so 라이브러리의 X 랩입니다 ghci하는'-lyourlibname' 추가 옵션을 포함하는 경우

그래서 X.cabal에

if impl(ghc < 7.8) cc-option: -fno-weak c-sources: cbits/dso_handle.c 

를 추가합니다. –

+0

@ n.m. 'libyourlibname.so'는 없습니다 - 라이브러리 X로 싸인 모든 코드는 라이브러리 X 자체에 포함되어 있습니다. – Artyom

+0

흠, 네 말이 맞아 보인다. 기호는 알 수 없으며 정의되지 않았습니다. –

답변

4

이것은 실제로 7.8이 동적 GHCi로 기본적으로 전환 된 주된 이유 중 하나입니다. 모든 객체 파일 형식의 모든 기능을 지원하기보다는 동적 라이브러리를 구축하고 시스템에서 동적 로더가이를 처리 할 수있게합니다.

g ++ 옵션 -fno-weak으로 빌드를 시도하십시오. g ++ 사람이 페이지에서 :

-fno-약한

그것이 링커에 의해 제공되는 경우에도, 약한 기호 지원을 사용하지 마십시오. 기본적으로 G ++는 약한 심볼을 사용할 수있는 경우이를 사용합니다. 이 옵션은 테스트 용으로 만 존재하며 최종 사용자가 사용해서는 안됩니다. 열등한 코드가 발생하고 이점이 없습니다. 이 옵션은 G ++의 이후 릴리스에서 제거 될 수 있습니다.

__dso_handle과 관련된 다른 문제가 있습니다. 라이브러리를로드하고 심볼을 정의하는 파일에 링크하여 분명히 작업 할 수 있다는 것을 발견했습니다. 이 해킹으로 인해 문제가 발생하는지 여부는 알 수 없습니다. cbits/dso_handle.c

void *__dso_handle;