2013-03-11 6 views
0

리눅스 GCC에 DLL을로드 할 수 없습니다 나는 내가 ./prog내가 만든 DLL 내 코드를 컴파일하기 위해 노력하고있어

./prog '이라고 쓸 때 아래 오류 얻을 : 공유 라이브러리를로드하는 동안 오류 : libctest.so.1 : 나는이 the tutorial here 다음 해당 파일이나 디렉토리

을 내 모노 응용 프로그램은 아무 문제 DLL을로드하고 함수를 호출이 없습니다 : 오브젝트 파일을 공유하지 열 수 없습니다. 튜토리얼의 핵심 부분이었다

gcc -Wall -fPIC -c *.c 
gcc -shared -Wl,-soname,libctest.so.1 -o libctest.so.1.0 *.o 
mv libctest.so.1.0 /opt/lib 
ln -sf /opt/lib/libctest.so.1.0 /opt/lib/libctest.so.1 
ln -sf /opt/lib/libctest.so.1.0 /opt/lib/libctest.so 

내 C# 코드는 내가

gcc -Wall -L/opt/lib main.c -lctest -o prog 

이 내가 변경 제일 먼저로 구축

[DllImport("path/to/CDLL", CallingConvention = CallingConvention.Cdecl)] 
public static extern void test(); 

않습니다. prog.c에서 main.c까지 거기에서 나는이 질문의 맨 위에서 오류를 얻으려면 ./prog을 사용합니다. 권한으로 문제가 있어서는 안됩니다. 나도 chmod 755 그렇게. 내가 도대체 ​​뭘 잘못하고있는 겁니까? 이것은 오픈 소스입니다. 나는 /opt/lib 그래서 난이 라이브러리 의존성을 해결하기 위해 시도 할 때

+0

/opt/lib를 LD_LIBRARY_PATH에 추가해보십시오. – teppic

답변

3

동적 링커 ld.so는 기본적으로 /opt/lib에 보이지 않는 것 있어야 할 곳에이 경로가 등록되지 않은 생각하고 만들어야했습니다. 링커에게 비표준 라이브러리 디렉토리를 알려 주거나 prog 바이너리에 /opt/lib 경로를 추가해야합니다.

예를 들어

LD_LIBRARY_PATH=/opt/lib ./prog 

또는, -rpath 링커 옵션으로 링크 prog. 이렇게하면 공유 객체의 위치를 ​​확인할 때 링커가 검색 할 수있는 추가 경로가 제공됩니다.

gcc -Wall -L/opt/lib -Wl,-rpath,/opt/lib main.c -lctest -o prog 

ldd 명령을 사용하여 공유 라이브러리의 위치를 ​​표시 할 수 있습니다.

ldd prog 

이 현재 libctest.so 찾을 수 없음을 보여줍니다. 추가 검색 경로를 사용하면 다음 명령을 실행하면 모든 라이브러리가 확인되었음을 알 수 있습니다.

LD_LIBRARY_PATH=/opt/lib ldd prog 
+0

부탁드립니다. 감사합니다. –

관련 문제