2012-02-24 1 views
1

1) 일부 해외 라이브러리 (즉, gcrypt, gpg-error, zssh2)와 연결되는 공유 라이브러리가 포함 된 프로젝트가 있습니다. 그것을 "mylib"라고 부를 수 있습니다. 이 라이브러리는 완벽하게 빌드되어 있으며 libtool이 종속성을 올바르게 링크하고 있습니다.Autoconf : 맞춤 라이브러리에 링크 링커 오류가 발생했습니다.

libtool: link: ppc-linux-gcc -shared -fPIC -DPIC .libs/mylib1.o .libs/mylib2.o .libs/mylib3.o 
    -Wl,-rpath -Wl,/opt/ELDK/ppc_8xx/lib -Wl,-rpath \ 
    -Wl,/opt/ELDK/ppc_8xx/lib /opt/ELDK/ppc_8xx/lib/libssh2.so \ 
    -L/opt/ELDK/ppc_8xx/lib -lz /opt/ELDK/ppc_8xx/lib/libgcrypt.so \ 
    /opt/ELDK/ppc_8xx/lib/libgpg-error.so -lpthread -O2 \ 
    -Wl,-soname -Wl,mylib.so.0 -o .libs/mylib.so.0.0.0 

2) 동일한 프로젝트에는 "mylib"에 링크되는 여러 프로그램이 있습니다. I 명시 적으로 라이브러리를 검색 configure.ac은 "MYLIB"에서

/opt/ELDK-3.1/usr/bin/../lib/gcc-lib/ppc-linux/3.3.3/../../../../ppc-linux/bin/ld: \ 
    warning: libssh2.so.1, needed by ./../myLib/.libs/mylib.so, not found (try using -rpath or -rpath-link) 
/opt/ELDK-3.1/usr/bin/../lib/gcc-lib/ppc-linux/3.3.3/../../../../ppc-linux/bin/ld: \ 
    warning: libz.so.1, needed by ./../myLib/.libs/mylib.so, not found (try using -rpath or -rpath-link) 
/opt/ELDK-3.1/usr/bin/../lib/gcc-lib/ppc-linux/3.3.3/../../../../ppc-linux/bin/ld: \ 
    warning: libgcrypt.so.11, needed by ./../myLib/.libs/mylib.so, not found (try using -rpath or -rpath-link) 
/opt/ELDK-3.1/usr/bin/../lib/gcc-lib/ppc-linux/3.3.3/../../../../ppc-linux/bin/ld: \ 
    warning: libgpg-error.so.0, needed by ./../myLib/.libs/mylib.so, not found (try using -rpath or -rpath-link) 
./../myLib/.libs/mylib.so: undefined reference to `libssh2_channel_process_startup' 
./../myLib/.libs/mylib.so: undefined reference to `libssh2_scp_send_ex' 

:

AC_SEARCH_LIBS(gpg_err_set_errno,[gpg-error]) 
AC_SEARCH_LIBS(gcry_check_version,[gcrypt]) 
AC_SEARCH_LIBS(deflate,[z]) 
AC_SEARCH_LIBS(libssh2_init,[ssh2]) 

해야합니다 나는 또한 내가 그들을 연결하려고하면 는하지만, 나는 같은 이전 라이브러리에 대해 링커 오류를 가지고 명시 적으로 "mylib"를 사용하는 모든 프로젝트의 모든 라이브러리를 포함합니까? "mylib"에 처음 연결했을 때 이미 해결되어서는 안됩니까?

더 좋은 방법이 있습니까?

감사합니다.

피씨 : autoconf와 관련해 매우 현명하지 않습니다. 죄송합니다.

참고 : (아직은 오래된) ELDK 3.1을 사용하여 PowerPC 용으로 크로스 컴파일합니다.

+0

당신이 Makefile.am에서 프로그램에 대한 지침 중 하나를 무시합니까? –

+0

내가 좋아하는 뭔가를'program1_CPPFLAGS = -I $ (top_srcdir) $ (MYLIB_CFLAGS)는''MYLIB_CFLAGS'와'MYLIB_LIBS'는 "프로그램 1"의 configure.ac''에 AC_ARG_WITH''로 정의되는 곳 나를에 연결할 수 있도록 시스템을 설치 한 대신 로컬 "mylib"를 설치하십시오 (이 작업을 수행하는 더 좋은 방법인지 알려주십시오). – j4x

+0

CPPFLAGS는 관련이 없지만 Makefile.am에서 MYLIB_LIBS를 어떻게 사용합니까? 최종 메이크에서 AC_SEARCH_LIBS 지정된 라이브러리를 찾는 데 성공하면 라이브러리를 포함해야하는 (LIBS) 거기에 $ (LINK) 명령이 포함 된 프로그램 1의 $ (EXEEXT)의 대상이되어야한다, 그리고 그 명령은 $이 있어야합니다. 난 당신이 크로스 컴파일을있을 때 수행하는 것입니다 얼마나 쉬운 모르겠어요하지만 –

답변

1

참고 : 나는 2 년 후 답을 받았기 때문에 내 문제를 해결 한 것이 아니기 때문에 내가 한 일을 모든 사람과 공유하는 것이 더 좋습니다.


답변 : 나는 자동으로 autoconf 기반 프로젝트에서 링커 종속성을 포함 발견

더 좋은 방법은 내 라이브러리에 pkg-config 정보를 추가하는 것이 었습니다.configure.ac

변경 :

export PKG_CONFIG_PATH=../MyLibPath:${PKG_CONFIG_PATH} 
PKG_CHECK_MODULES([DEPS], [libssh2 >= 1.3.0]) 

# Output configuration files. 
AC_CONFIG_FILES([Makefile libMyLib-1.0.pc libMyLib-1.0-uninstalled.pc]) 

두 번째 출력 파일 libMyLib-1.0-uninstalled.pc 날 MYLIB의 제거 된 버전으로 내 프로젝트를 지속적으로 발전 할 수 있도록하는 것입니다.

변경 Makefile.am에 :

libMyLib_la_CPPFLAGS = $(DEPS_CPPFLAGS) 
libMyLib_la_CFLAGS = $(DEPS_CFLAGS) 
libMyLib_la_CXXFLAGS = $(DEPS_CXXFLAGS) 
libMyLib_la_LIBADD = $(DEPS_LIBS) 

pkgconfigdir = $(libdir)/pkgconfig 
pkgconfig_DATA = libMyLib-1.0.pc 

libMyLib-1.0.pc 프로젝트에 추가 :

[email protected]@ 
[email protected][email protected] 
[email protected]@ 
[email protected]@ 

Name: MyLib 
Description: My library. 
Requires: libssh2 
Requires.private: 
Version: @[email protected] 
Libs: -L${libdir} -lMyLib -lstdc++ -lm -lslog -lpthread 
Libs.private: 
Cflags: -I${includedir}/libMyLib-1.0 

libMyLib-1.0-uninstalled.pc을 :

[email protected][email protected] 
[email protected][email protected] 
libdir=${prefix}/.libs 
includedir=${prefix} 

Name: MyLib 
Description: My library. 
Requires: libssh2 
Requires.private: 
Version: @[email protected] 
Libs: -Wl,-rpath-link,${libdir} -L${libdir} -lMyLib -lstdc++ -lm -lslog -lpthread 
Libs.private: 
Cflags: -I${includedir}/ 
각 의존 프로젝트에서

:

configure.ac :

export PKG_CONFIG_PATH=../MyLibPath:${PKG_CONFIG_PATH} 
PKG_CHECK_MODULES([MYLIB], [libMyLib-1.0 >= 1.0.0]) 

Makefile.am :

dependent_CPPFLAGS = $(MYLIB_CPPFLAGS) 
dependent_CFLAGS = $(MYLIB_CFLAGS) 
dependent_CXXFLAGS = $(MYLIB_CXXFLAGS) 
dependent_LIBADD = $(MYLIB_LIBS) 
+1

당신은 libs와 항목에'-rpath-link'을 필요가 없습니다. –

+0

예,'uninstalled' 프로파일의 다른 경로에 있습니다. 감사! – j4x

0

그것은 당신이 당신의 Makefile.am 또는 configure.ac에 무엇이 모른 채 일을하는지 정확히 알려 어렵습니다,하지만 난 당신이 -Wl,-rpath을 사용하고 볼 수 있기 때문에, 나는 당신이 ./configure를 호출 할 때 외부에서 LDFLAGS로 전달하는 것으로 가정 .

libtool은 일반적으로 -rpath 값을 저장하지 않지만 -L을 저장합니다. 그래서 내 평소 제안은 -L-rpath을 전달하여 파일에 .la 파일에 연결할 라이브러리를 찾을 수있는 경로가 포함되도록하는 것입니다.

모든 단일 바이너리에 이것을 전달할 필요는 없지만 libtool은 링크 편집기가이를 올바르게 처리하도록합니다.

+0

Diego에 답해 주셔서 정말로 감사드립니다. 나는'pkgconfig'를 플레이하는 것으로 끝내고 내 문제를 해결했습니다. 이제는 각 종속성에 대해 링크 된 라이브러리를 반복 할 필요가 없습니다. 그것은 autoconf'가 자동으로 "캐스케이드"이 종속성 ... – j4x

+0

에만 공유 객체 종속성을 계단식 아니라 정적 아카이브를,하지만 당신은 몇 가지 추가 가지고있는 것처럼이 경우에는이 날 것으로 보인다 수 할 수없는 '것을하지만, 실망 의존성은 전혀 다른 경로에 있으며, 검색 경로가 변경되어 까다로워집니다. –

+0

성가신 생각은 내가 공유 프로젝트에 종속 (공유) 라이브러리를 계속 반복했다 있다는 것입니다. MyLib이 이미 동적으로 링크되어 있음에도 불구하고 (이미 MyLib에서 링크 된) 종속성을 생략하면 최종 프로그램/라이브러리에서 링커 오류가 발생합니다. – j4x