2013-08-27 2 views
2

저는 약간의 OpenWRT 응용 프로그램을 구축 중이며 정적으로 라이브러리를 연결하려고합니다.c - 링커 오류 빌드 OpenWrt 패키지

EDIT : libcurl뿐만 아니라 다른 라이브러리에서도 마찬가지입니다. 를 구축하는 동안

이 오류를 받고 있어요 :

make[3]: Entering directory `/home/md/work/openwrt/build_dir/target-mips_r2_uClibc-0.9.33.2/app' 
mips-openwrt-linux-uclibc-gcc -c -Os -pipe -mips32r2 -mtune=34kc -mno-branch-likely -fno-caller-saves -fhonour-copts -Wno-error=unused-but-set-variable -msoft-float -Wall -Werror main.c -o main.o 
mips-openwrt-linux-uclibc-gcc -Os -pipe -mips32r2 -mtune=34kc -mno-branch-likely -fno-caller-saves -fhonour-copts -Wno-error=unused-but-set-variable -msoft-float -Wall -Werror -L/home/md/work/openwrt/staging_dir/target-mips_r2_uClibc-0.9.33.2/usr/lib -L/home/md/work/openwrt/staging_dir/target-mips_r2_uClibc-0.9.33.2/lib -L/home/md/work/openwrt/staging_dir/toolchain-mips_r2_gcc-4.6-linaro_uClibc-0.9.33.2/usr/lib -L/home/md/work/openwrt/staging_dir/toolchain-mips_r2_gcc-4.6-linaro_uClibc-0.9.33.2/lib -Wl,-Bstatic -lcurl main.o -o app 
/home/md/work/openwrt/staging_dir/toolchain-mips_r2_gcc-4.6-linaro_uClibc-0.9.33.2/lib/gcc/mips-openwrt-linux-uclibc/4.6.4/../../../../mips-openwrt-linux-uclibc/bin/ld: cannot find -lgcc_s 
/home/md/work/openwrt/staging_dir/toolchain-mips_r2_gcc-4.6-linaro_uClibc-0.9.33.2/lib/gcc/mips-openwrt-linux-uclibc/4.6.4/../../../../mips-openwrt-linux-uclibc/bin/ld: cannot find -lgcc_s 
collect2: ld returned 1 exit status 
make[3]: *** [app] Error 1 

내가 검색 경로에 libgcc_s.so 가지고 있기 때문에 그것은, 이상한 : 나는 -rpath와 일부 해킹을 시도

stormbreaker:openwrt> find . -name libgcc_s.* 
./build_dir/toolchain-mips_r2_gcc-4.6-linaro_uClibc-0.9.33.2/uClibc-0.9.33.2/libc/sysdeps/linux/common/libgcc_s.h 
./build_dir/toolchain-mips_r2_gcc-4.6-linaro_uClibc-0.9.33.2/gcc-linaro-4.6-2012.12-final/gcc/libgcc_s.so 
./build_dir/toolchain-mips_r2_gcc-4.6-linaro_uClibc-0.9.33.2/gcc-linaro-4.6-2012.12-final/gcc/libgcc_s.so.1 
./build_dir/toolchain-mips_r2_gcc-4.6-linaro_uClibc-0.9.33.2/gcc-linaro-4.6-2012.12-final/mips-openwrt-linux-uclibc/libgcc/libgcc_s.so 
./build_dir/toolchain-mips_r2_gcc-4.6-linaro_uClibc-0.9.33.2/gcc-linaro-4.6-2012.12-final/mips-openwrt-linux-uclibc/libgcc/libgcc_s.so.1 
./build_dir/target-mips_r2_uClibc-0.9.33.2/toolchain/ipkg-ar71xx/libgcc/lib/libgcc_s.so.1 
./build_dir/target-mips_r2_uClibc-0.9.33.2/toolchain/libgcc_s.so.1 
./staging_dir/toolchain-mips_r2_gcc-4.6-linaro_uClibc-0.9.33.2/lib/libgcc_s.so 
./staging_dir/toolchain-mips_r2_gcc-4.6-linaro_uClibc-0.9.33.2/lib/libgcc_s.so.1 
./staging_dir/target-mips_r2_uClibc-0.9.33.2/root-ar71xx/lib/libgcc_s.so 
./staging_dir/target-mips_r2_uClibc-0.9.33.2/root-ar71xx/lib/libgcc_s.so.1 

-rpath-link하지만 같은 결과가 나옵니다. 내가 아는 한, libcurl에는 libgcc_s가 필요하지 않습니다.

나는이 문제를 재현하는 간단한 사건을 만들어 :

openwrt/package/app/Makefile의 관련 부분 :

TARGET_CFLAGS += -Wall -Werror 
TARGET_LIBS = -Wl,-Bstatic -lcurl 

define Build/Compile 
    CC="$(TARGET_CC)" \ 
    CFLAGS="$(TARGET_CFLAGS)" \ 
    LDFLAGS="$(TARGET_LDFLAGS)" \ 
    LIBS="$(TARGET_LIBS)" \ 
    $(MAKE) -C $(PKG_BUILD_DIR) 
endef 

openwrt/package/app/src/Makefile :

:

APP = app 
SOURCES = $(wildcard *.c) 
OBJECTS = $(SOURCES:.c=.o) 

$(APP): $(OBJECTS) 
    $(CC) $(CFLAGS) $(LDFLAGS) $(LIBS) $(OBJECTS) -o $(APP) 

# Objects 
%.o: %.c 
    $(CC) -c $(CFLAGS) $< -o [email protected] 

응용 프로그램 자체가 하나의 파일

#include <stdio.h> 
#include <curl/curl.h> 

int main (void) 
{ 
    curl_global_init(CURL_GLOBAL_ALL); 
    printf("Ok!\n"); 
    return 0; 
} 
( -Wl,--verbose=99 사용) 링커의 상세를 증가3210

답변

1

나에게 이러한 단서를 주었다

libgcc_s의 정적 버전이없는 것처럼
... 
attempt to open /home/md/work/openwrt/staging_dir/target-mips_r2_uClibc-0.9.33/usr/lib/libgcc_s.a failed 
attempt to open /home/md/work/openwrt/staging_dir/toolchain-mips_r2_gcc-4.6-linaro_uClibc-0.9.33/lib/gcc/mips-openwrt-linux-uclibc/4.6.3/libgcc_s.a failed 
attempt to open /home/md/work/openwrt/staging_dir/toolchain-mips_r2_gcc-4.6-linaro_uClibc-0.9.33/lib/gcc/mips-openwrt-linux-uclibc/4.6.3/../../../../mips-openwrt-linux-uclibc/lib/libgcc_s.a failed 
attempt to open /home/md/work/openwrt/staging_dir/toolchain-mips_r2_gcc-4.6-linaro_uClibc-0.9.33/mips-openwrt-linux-uclibc/bin/../../../toolchain-mips_r2_gcc-4.6-linaro_uClibc-0.9.33/usr/local/lib/libgcc_s.a failed 
attempt to open /home/md/work/openwrt/staging_dir/toolchain-mips_r2_gcc-4.6-linaro_uClibc-0.9.33/mips-openwrt-linux-uclibc/bin/../../../toolchain-mips_r2_gcc-4.6-linaro_uClibc-0.9.33/lib/libgcc_s.a failed 
attempt to open /home/md/work/openwrt/staging_dir/toolchain-mips_r2_gcc-4.6-linaro_uClibc-0.9.33/mips-openwrt-linux-uclibc/bin/../../../toolchain-mips_r2_gcc-4.6-linaro_uClibc-0.9.33/usr/lib/libgcc_s.a failed 
etc. 

보인다.

어쨌든, 나는 내 패키지 Makefile을 변경 :) = 나를 위해

TARGET_LIBS = -Wl,-Bdynamic -lgcc_s \ 
       -Wl,-Bstatic -lcurl 

define Build/Compile 
    $(TARGET_CONFIGURE_OPTS) \ 
    CFLAGS="$(TARGET_CFLAGS)" \ 
    LDFLAGS="$(TARGET_LDFLAGS)" \ 
    LIBS="$(TARGET_LIBS)" \ 
    $(MAKE) -C $(PKG_BUILD_DIR) 
endef 

작품

내가 왜 종속성의 정적 버전을 필요 정적 라이브러리와 링크 이해하지만 '년후 링커가 역동적 인 버전을 먼저 사용하지 않고도 내 뒤에서 그것을 할 수 있기를 기대합니다.

+1

링커의 자세한 정보를 어떻게 증가 시킵니까? 이렇게 : * TARGET_LIBS = -Wl, - verbose = 99 *? –

+1

오랜 시간이 걸렸지 만, 그것이 맞다는 것이 확실합니다. 100 % 정확하려면 플래그를 전달할 올바른 변수는 LDFLAGS =입니다. –