2016-10-20 7 views
1

정적 라이브러리 L을 생성하는 프로젝트가 있습니다. L의 일부 기능은 일부 플러 거스 M을로드 할 수 있습니다 (dlopen("libmmmm.so") : M은 공유 라이브러리 (모듈) 임). .autotoos/libtool에서 적절한 플러그인 (모듈) 처리

L의 module_load() 함수를 테스트하는 테스트 T는 T + L에서의로드를 테스트하기 위해 L 테스트의 주요 테스트 T (L은 통계적으로 링크 됨)와 플러그 인 M으로 구성됩니다.

테스트는 설치의 일부입니다 (testdir이 정의되어 있음).

#the test program linked with the static lib L: 
#(the tests are distributed as well, hence the test_* prefix)         
test_PROGRAMS = tttt          
tttt_SOURCES = tttt.c 
tttt_LDADD = llll.la 

#the module to be loaded by the T+L test:              
lib_LTLIBRARIES = libmmmm.la           
libmmmm_la_SOURCES = mmmm.c         
libmmmm_la_LDFLAGS = $(AM_LDFLAGS) -module -shared 
문제는 모듈을 찾을 수있는 경로에 관한됩니다

: 테스트 작업을 (즉, libmmmm

여기에 테스트 T의 디렉토리에있는 Makefile.am (건물 모두 T와 M)을 다음과 .so가 있습니다) 확인을 위해. 하지만 out of tree (VPATH) 빌드 (공유 라이브러리를 찾을 수 없음)에 실패합니다.

그래서 질문 : 어떻게 작동합니까? libtool이는, 내 생각, dlopen()으로 *.la 래퍼를 결코 이해하지 못할 것입니다 LD_LIBRARY_PATH 같은 것을 ... 설정하는

그래서합니까 이것은 그래서 나무에서, 즉 확인을 항상 작동 내가 고칠 수있는 방법은 무엇 build, distcheck ... .libs 디렉토리에 대한 검색 경로를 하드 코딩하는 것은 매우 휴대 가능하다고 느끼지 않습니다. 우리는 여러 플랫폼을 대상으로하기 때문에 autotools를 사용합니다.

PS : 나는 때문에 당신은 그것을 돌봐 libltdl를 사용할 수있는 "-module"옵션

+0

@ Diego의 조언은 갈 길이 멀다. 소프트웨어가'libtool'로 빌드되면'libltdl'은 GPL에 의해 방해받지 않습니다. 이식성이 있으며 특정 플랫폼에서 제공하지 않으면 기능을 에뮬레이트합니다. 모듈은 [automake'] (http://www.gnu.org/software/automake/manual/automake.html#Libtool-Modules) 매뉴얼에서 간략하게 언급됩니다. 'automake'와'libltdl'에 대한 더 자세한 개요는 ['libtool'] (http://www.gnu.org/software/libtool/manual/libtool.html#Using-libltdl) 매뉴얼에 있습니다. –

답변

2

에 M의 "LIB"접두사를 생략 할 수 있음을 알고, 그 중 하나는 .la 파일을 이해하고, 않습니다 로드를 수정하지만 100 % 동일한 API가 아닙니다.

그렇지 않은 경우이 상황에서 LD_LIBRARY_PATH을 설정하는 자체 래퍼 스크립트를 작성해야합니다.

+0

실제로 @ Diego의 조언에 문제가 있습니다. 라이브러리 L을 링크 할 때 "lt__PROGRAM__LTX_preloaded_symbols '에 대한 정의되지 않은 참조가 있습니다. autools가 L을 연결할 때 이미 -dlopen 옵션에 대해 알고 싶어하는 것 같습니다! 그러나 테스트 T만이 그것을 알고 있습니다! 그래서 이제 tttt_LDAD 줄에 "-dlopen mmmm.la"옵션이 생깁니다 ... LIB를 빌드 할 때 libltdl을 사용할 수 있습니까? (즉, 로딩 될 모듈이 알려지기 전에). – user1159290

+0

하지만 ldl lib에는 lt_libltdl_LTX_preloaded_symbols라는 기호가 있습니다. 이것은 lt__PROGRAM__LTX_preloaded_symbols와 같을까요 ??? – user1159290