2010-06-09 1 views
1

- 공유 객체 libfoo.so을 만들려고합니다. libfoo.sofoo.c 에서 생성되었습니다. - 헤더가 과 인 것으로 가정합니다. 컴파일러에서
은 Static.h의 심볼을 해결하고, 나머지는 Dynamic.h에서 런타임을 위해 남겨 둡니다. - 어떻게해야합니까? 내가 통과해야하는 CFLAG와 LDFLAG 옵션은 무엇입니까? - 내 makefile이 CFLAGS = fPIC, 공유, W1, 내보내기 - 동적을 사용하여 공유 객체를 만들도록 설정되었습니다. - 경로 포함 i "Static.h"의 올바른 위치를 지정하십시오.GCC/C++ 공유 객체의 헤더에 대한 정적 연결

나를 도와 줄 수 있습니까?

+1

여기서'static.h '의 기호는 어디서 오는 것입니까? 다른 도서관? –

+0

아니요 다른 도서관에서 가져온 것이 아닙니다. 나는 그들이 static.cc의 객체 코드에서 왔음을 "기대한다."나는 올바른 경로를 제공하고 컴파일러가 거기에서 그것을 이해하기를 희망한다. –

답변

0

당신이 묘사 한 기능은 GCC 링커에서 무료로 얻을 수 있다고 생각합니다. 링킹 프로세스 중에 링커는 명령 행에서 전달 된 라이브러리에 대한 코드 참조를 모두 해석합니다. 참조 된 심볼 이름이 정적 라이브러리 (.a 파일)에 포함되어 있으면 '정적으로'링크되고 심볼이 동적 링크 라이브러리 (.so 파일) 내에 있으면 프로그램에서 동적으로 링크됩니다 실행 시간.

일반적으로 C/C++ 코드에 영향을 미치지 않으므로 심볼이 정적으로 또는 동적으로 링크되는지 여부를 신경 쓸 필요가 없습니다. 귀하의 설명에서 귀하의 질문에 대한 동기를 이해하기는 어렵지만 dlopen() 시스템 호출을 통해 동적 링크 라이브러리를 명시 적으로로드 할 필요가있을 수 있습니다. 첫 번째 단락이 귀하의 질문에 대답하지 못하면 해결하려는 일반적인 문제를 설명해 주시겠습니까?

+0

답장을 보내 주셔서 감사합니다. snmp 에이전트를 확장하고 * .so 객체를 작성하여 확장 된 기능을 제공합니다. 메이크의 요약 CFLAGS + = $ (INCDIRS) -shared -fPIC CFLAGS + = FNO 엄격 앨리어싱 LDFLAGS + = 수출 동적 SHLIB1 = SomeName.so SHLIB1_SRCS = foo.c를 그리고 그 시스템에서 일반적인 makefile 매크로가 많이 있습니다. –

+0

나는 계속보고 있습니다. dlopen이 실패했습니다 : /SomeDir/lib/ifTable.so : 정의되지 않은 기호 : _ZN15SomeRecord4initER14TransactionRep 그리고이 소스는 내가 포함 된 헤더 파일입니다. 일단 특정 헤더 파일을 제거하면이 메시지가 표시되지 않습니다. –

+0

일반적으로 '정의되지 않은 심볼'은 필수 라이브러리와의 링크를 무시하고 있음을 의미합니다. 어떤 .so 파일이 심볼을 정의 하는지를 결정하는 한 가지 방법은 빠진 심볼을 포함 할 수있는 .so 파일에서 다음 명령을 실행하는 것입니다 :'objdump -t .so | grep SomeRecord4init' – Rakis

1

dlopen(), dlclose(), dlsym(), dlerror() 외부 런타임 라이브러리를 열 수 있습니다. 외부 객체에 대한 함수 포인터를 선언하고 런타임에이를 해결해야합니다.

코드에 "bare"라는 참조 만 남기면 링커가 심볼을 해결하려고 시도합니다. 그것은 그것을 해결하거나 오류를 던져서, 당신은 executabel 이미지를 얻지 못하게 할 것입니다. 해결되지 않은 기호를 연결하려고 시도하는 것을 제외시키기위한 링커 옵션을 모른다.

아니면 무엇을 하려는지 알지 못합니다.

+1

'dlclose'가 아닌'dlfree'입니다 –

+0

예, 고마워요. –

0

모든 동적 기호가 각 헤더에서 (extern을 통해) 설명되지만 잠재적으로 선언되지 않는 한 응용 프로그램이 심볼을로드하고 정의 할 때 런타임 링커에 의해 나중에 특정 시점에 겹쳐 쓸 수 있습니다 실행 링크 링커는 하나 이상의 심볼이없는 경우 (SomeRecord4init로 위에서보고 한 것처럼) 누락 된 비트 또는 실행 파일의 barfs를 채 웁니다.

많은 일반적인 빌드/분석 도구를 통해 lib 의존성을 추적하는 데 어려움이있는 libdl을 사용하는 대신 라이브러리와 응용 프로그램을 연결할 수도 있습니다. CFLAGS에서 -shared와 not -static를 사용하면됩니다.

많은 프로젝트가 개인용 및 공개용 API와 필드를 정의하지만 라이브러리에서는 C로 표시됩니다. 이 문제를 해결하기 위해해야 ​​할 일은 무엇입니까?

+0

약한 기호와 강한 기호의 점도 있지만 의도적으로 그 점을 지적했습니다. – yaneurabeya

관련 문제