2013-09-30 3 views
1

C 코드를 컴파일하는 데 사용하는 정적 라이브러리 matrixlib.a이 있습니다. 이 코드는 gcc으로 컴파일되며 정상적으로 작동합니다. 그러나 나는이 라이브러리를 C++ 코드에 소개하고 문제가 시작될 때이를 사용하고자합니다. 나는 C 코드를 컴파일하고 방법 :gcc, g ++ 및 gfortran과 연결

의 gcc -I/매트릭스/-O -Wall example.c -c -o example.o에
gfortran example.o에/매트릭스/lib 디렉토리/matrixlib을 포함한다. -lblas -fopenmp -o example_c 지금 우리는 gccg++에 대한 교환하는 경우

:.

example.c :(텍스트 + 0xf5) : mygemm_solver`정의되지 않은 참조 (INT, 이중 CONST의 * 두 번 * 두 번 *, INT, INT)는 '

내가 example.c 파일을 사용하고있는 기능 mygemm_solver 서비스를 제공합니다. 내가 뭘 잘못하고 있는지 생각해?

+0

c를 C로, C++를 C++로 컴파일해야합니다. – doctorlove

답변

8

example.c의 함수는 아마도 extern "C"으로 선언되지 않으므로 C++ 컴파일러는 생성 된 기호 이름에 이름 - mangling을 적용합니다. Fortran 코드는 맹 글링 된 이름을 사용하지 않으므로 링커가 기호를 찾으려고 시도 할 때 기호를 찾을 수 없습니다.

첫 번째 단계는 C/C++ 코드에서 "내보내는"모든 기능의 프로토 타입을 헤더 파일에 넣는 것입니다. 상단에 이것을 넣어 : 다음

#ifdef __cplusplus 
extern "C" { 
#endif 

그리고이 바닥에서이 자동으로 헤더에 선언 된 모든 기능에 extern "C"을 적용하는 효과가

#ifdef __cplusplus 
} 
#endif 

, 그러나 당신이로 컴파일하는 경우에만 C++.

그러나 C 및 C++은 의미가 다른 다른 언어입니다 (예 : void *에서 암시 적으로 변환하는 것과 관련하여). C 컴파일러로 C 코드를 컴파일하고 C++ 컴파일러로 C++ 코드를 컴파일해야합니다. 기술적으로 C와 C++ 모두 유효하며 두 언어 모두에서 동일한 의미를 갖는 코드를 작성할 수는 있지만이 작업을 수행하는 이유는 거의 없습니다.

+0

@_cdhowie 맞아요, extern "C"를 선언하지 않았습니다. 머리글을 편집하면 어떻게 되나요? – Manolete

+0

@Manolete이 헤더가'example.c'에 포함되어 있다면 아마도 그렇게 될 것입니다. C++ 컴파일러는 생성 된 기호가 엉망이되지 않도록 이것을보아야합니다. – cdhowie