2012-04-12 2 views
0

를 찾을 수 없다는 오류가되어지고, DLL에 공유 라이브러리로 전환 ,하지만 pow()가 필요한 함수를 호출하면 충돌이 발생합니다. 그것은 공유 라이브러리 였을 때 완벽하게 작동했습니다. gcc와 makefile을 사용하여 컴파일하고 있습니다. 내가 makefile에 한 유일한 변경은 라이브러리에 -ldl을 추가하는 것이었다. 나는 아직도 그것을 가지고있다. 공유 라이브러리 대신 dll에 대한 변경을 지원하도록 드라이버 프로그램을 변경했지만 오류를 유발하는 함수는 변경되지 않았습니다.이제 오류가 펑() 여기

변경해야 할 메이크 파일이 더 있습니까?

testlib: src/driver.o src/prog3.o 
    gcc -fPIC -Wall -c src/prog3.c -o src/prog3.o 
    gcc -Wall -shared -o src/libprog3.so src/prog3.o 
    gcc -Wall -o [email protected] src/driver.c -ldl -lm -Lsrc -lprog3 
+0

어떤 플랫폼입니까? –

+0

xubuntu x64를 사용하고 있습니다. – user1279914

+0

예제 makefile 스 니펫의 마지막 줄에'-ldl'을 추가 했습니까? 그래서'-ldl'을 제거하면 다시 작동합니까? 중요한 정보가 누락 된 것처럼 느껴집니다. –

답변

3

당신은 일을 할 필요가 : 여기 메이크입니다

gcc -Wall -shared -o src/libprog3.so src/prog3.o -lm 

, 공유 라이브러리는 종속성 빌드해야합니다. -lm을 생략하면 libprog3.so에있는 확인되지 않은 기호는 이미로드 된 주 프로그램의 기호로 해결되도록 의도되었습니다. 난 당신이 주 프로그램에 대한 링크 명령 행에 -lm를 넣어 않았다 볼 수 있지만 내 생각은 메인 프로그램이 실제로 libm.so에서 어떤 기호를 사용하지 않았다이며, 따라서 메인 프로그램의 DT_NEEDED 테이블에 추가되지 않았고, 그러므로 아직로드되지 않았습니다.

어떤 경우에도 종속성을 이와 같이 명시 적으로 지정하는 것이 거의 항상 최선입니다.

+0

실제로 이전에 시도했지만 작동하지 않았지만 다시 시도했지만 이제는 작동합니다. 나는 다른 길을 내가 잘못 고쳤다 고 생각한다. 생각을 멈추기 전에 동적 링크를 만들기 전에 문제가 발생했기 때문에 문제가되었습니다. 고맙습니다! – user1279914