2012-04-24 3 views
4

내 PHP 확장 프로그램 내에서 사용할 정적 라이브러리를 만들려고합니다. 이를 위해 gcc -c file.c -o file.o을 사용하여 .c 파일을 컴파일하고 .o 개의 파일을 얻습니다. 그런 다음 ar rcs lib.a *.o을 사용하여 컴파일 된 모든 개체를 .a 파일로 보관합니다. 내가 할, 내가 대신 .a 파일의 .o 파일을 사용하는 경우정적 라이브러리 만들기

*** Warning: Linking the shared library <extension>.la against the 
*** static library lib.a is not portable! 

:

이 일을 한 후, 내 PHP 확장을 컴파일 할 때 나는이 .a 파일을 참조 합니다만, 나는 다음과 같은 오류가 발생합니다 :

*** Warning: Linking the shared library <extension>.la against the non-libtool 
*** objects file1.o file2.o is not portable! 

무엇이 잘못 되었습니까? 올바른 방법은 무엇입니까?

답변

5

짧은 대답 : 공유 라이브러리 (PHP 확장자가 특별한 경우)는 정적 라이브러리에 의존 할 수 없습니다.

사실 사실은 완전히 사실이 아닙니다. 정적 라이브러리가 위치 독립적 코드 (PIC)로 구축되어있는 한 공유 라이브러리에서이 라이브러리를 사용하면됩니다. .o 파일을 .o 파일에 정의되지 않은 기호를 충족시키기 위해 필요하다면 명시 적으로 연결하여 .so을 가져 와서 공유 라이브러리 파일의 일부가되게 할 수 있습니다. 공유 라이브러리에 .o 파일도 (I386 등) 일부 아치에서 작동하지만 휴대용 아니에요 (및 x86_64의에서 작동하지 않습니다) 비 PIC 연결

.

당신이해야 할 일이 있다면 중간의 .a 파일을 잊어 버리고 모든 .o 파일을 내선 번호 .so 파일에 명시 적으로 연결해야합니다. 이것은 깨끗하고 단순합니다. 또는 모든 파일이 PIC (즉, -fPIC 옵션)로 빌드 된 경우 계속해서 작업을 수행 할 수 있습니다.

내가 할 수없는 일은 추가 파일 .so을 만들어 설치하면 확장 파일 .so이 의존하게됩니다. 이 모든 일은 팽창을 불러오고로드 시간을 늘리고 배포/통합에 많은 문제를 만듭니다.

+0

볼 수 있습니다 메이크 파일의 일부 링크 플래그를 corrcting하여 해결 한'경고 : 공유 라이브러리 .la를 libtool이 아닌 객체 인 file1.o file2.o에 연결하면됩니다. ' – rid

+2

libtool을 전혀 사용하지 않는다면 libtool을 사용하여 모든 것을 빌드해야합니다. –

+0

나는 사랑하고 싶지만, 어떻게 해야할지 모르겠다. 나는'libtool'을 사용하지 않고있다. PHP가있다. – rid

1

정적 라이브러리에 공유 라이브러리를 연결하는 것은 불가능합니다 (실제로 무엇을하는지 잘 모르는 경우). 하지 마.

첫 번째 경고는 libtool에서 가져 왔습니다. 그것은 당신이 요청한 작업이 다른 시스템에서 다른 일을 할 것이고 그 중 일부는 아마도 당신이 원하는 것이 아닐 것이라고 말합니다. 공유 라이브러리와 정적 라이브러리에있는 코드는 다른 컴파일러 플래그로 컴파일해야하기 때문에 여러 가지 멋진 방식으로 실패하는 경우가 많습니다.

내가 한 번 같은 문제에 직면했지만 난 당신이 내가`.o` 파일을 사용하는 경우, 내가 할

What is the meaning of “Warning: Linking the shared library against static library is not portable”?