OpenWrt 및 교재 Q&A

교차(cross)_컴파일 관련 질문입니다.

페이지 정보

작성자 정인권 작성일18-01-23 23:52 조회4,309회 댓글4건

본문

제가 프로그램을 한 짯는데.. ↓↓↓↓↓

/* (공유기에서 무선패킷을 캡쳐하고, 저의 PC로 소켓을 열어  클라이언트를 기다리고, 제가 공유기 ip로 접속시, 캡쳐한 패킷을 제게 날려주는 프로그램) */

일반 컴파일을 해보내 에러가없이 잘됩니다. 이제 교차컴파일을 통해 공유기에 올려서 되는지 실험해볼려는데,
크로스컴파일이 애먜하네요;;

openwrt용으로 Makefile을 어떻게 해야할지를 모르겠습니다... pcap_test.c 파일은 이거 하나구요,
일반 gcc 컴파일할땐 gcc -o pcap_test pcap_test.c -lpcap -I/usr/include/pcap 이렇게합니다.
Makefile 만드는법좀..알려주세요.

댓글목록

박우재님의 댓글

박우재 작성일

일반적인 리눅스 패키지(C코드와 제너럴 Makefile을 포함)의 크로스 컴파일의 경우 openwrt용 컴파일 Makefile을 따로 만드셔야 합니다.

http://wiki.openwrt.org/doc/devel/packages

여기에 자세한 설명이 나와 있구요. 파일을 FTP에 올리고 메이크 파일을 2개나 만들어서 배포에 적당한 용도 입니다. 배포가 아니시라면 툴체인을 통해 직접 컴파일 하시면 되는데요.

https://forum.openwrt.org/viewtopic.php?id=32912

요기 참고하세요.

정인권님의 댓글

정인권 작성일

제 Makefile입니다...

CC=/nclab/backfire/staging_dir/toolchain-mips_r2_gcc-4.3.3+cs_uClibc-0.9.30.1/usr/bin/mips-openwrt-linux-gcc

INCLUDE=/nclab/backfire/staging_dir/toolchain-mips_r2_gcc-4.3.3+cs_uClibc-0.9.30.1/usr/include
LIBRARY=/nclab/backfire/staging_dir/toolchain-mips_r2_gcc-4.3.3+cs_uClibc-0.9.30.1/usr/lib

CFLAGS = -g $(INC) -lpcap

ALL : Target

Target :
$(CC) -o pcap_99 pcap_test.c $(INC)


실제로 gcc로 할때는
gcc -o (파일명) pcap_test.c -lpcap -I/usr/include/pcap.h

이렇게 했습니다. ...
에러가..
:
/nclab/backfire/staging_dir/toolchain-mips_r2_gcc-4.3.3+cs_uClibc-0.9.30.1/usr/lib/gcc/mips-openwrt-linux-uclibc/4.3.3/../../../../mips-openwrt-linux-uclibc/sys-include/pcap.h:45:23: error: pcap/pcap.h: No such file or directory
pcap_test.c:43: warning: 'struct pcap_pkthdr' declared inside parameter list
pcap_test.c:43: warning: its scope is only this definition or declaration, which is probably not what you want
pcap_test.c: In function 'packet_handler':
pcap_test.c:65: error: dereferencing pointer to incomplete type
pcap_test.c: In function 'main':
pcap_test.c:126: error: 'bpf_u_int32' undeclared (first use in this function)
pcap_test.c:126: error: (Each undeclared identifier is reported only once
pcap_test.c:126: error: for each function it appears in.)
pcap_test.c:126: error: expected ';' before 'netp'
pcap_test.c:127: error: expected ';' before 'maskp'
pcap_test.c:128: error: 'PCAP_ERRBUF_SIZE' undeclared (first use in this function)
pcap_test.c:129: error: storage size of 'hdr' isn't known
pcap_test.c:133: error: storage size of 'fp' isn't known
pcap_test.c:134: error: 'pcap_t' undeclared (first use in this function)
pcap_test.c:134: error: 'pcd' undeclared (first use in this function)
pcap_test.c:138: warning: assignment makes pointer from integer without a cast
pcap_test.c:146: error: 'netp' undeclared (first use in this function)
pcap_test.c:146: error: 'maskp' undeclared (first use in this function)


이렇게뜨는건데;;;

위에 두번째 링크를 참고해보니
make menuconfig 할때 library 에서 libpcap을 선택해줘고 해야되는건가요? 영어라서;;;
도통 이해가잘안가네요.;;
조금더 자비를 배풀어주시면 감사하겠습니다. ㅠ

김동준님의 댓글

김동준 작성일

libpcap 라이브러리는 openwrt에서 package로 제공됩니다..

libpcap 을 설치하시면 될듯?^^

일단 설치해보시고 include 하실때 pcap.h가 있는 위치를 찾아서 지정해주시면 될듯합니다..

박우재님의 댓글

박우재 작성일

윗분 말씀대로 한번 해보시고요. 안돼시면요. pcap.h의 경로를 찾아서 I플래그 L플래그에 경로를 입력해 주시면 됩니다.

Openwrt 소스에는 패키지의 소스를 포함하지 않습니다. GNU라이센스나 Openwrt의 포터블한 성격을 유지하기 위해서 그런데요. 그렇기 때문에 실제로 컴파일하는 소스들(pcap.h)는 make를 실행할때 다운받아와서 staging_dir에 압축을 풀고 크로스컴파일을 하게 됩니다. 따라서 make menuconfig에서 libpcap을 선택해서 한번 전체 컴파일을 해주시구요. pcap.h파일을 staging_dir에서 찾아 보시기 바랍니다. 경로를 찾는 방법은 openwrt소스 디렉에서 'find ./ -name 'pcap.h'로 하시면 되구요. 찾으셔서 본인이 작성하신 소스를 컴파일 하시기 바랍니다. 권장되는 방법은 본인의 소스를 패키지화해서 패키지 Makefile을 만드는게 옳은 방법이나, 패키지의 단일성상 개별로 컴파일 하실 경우에는 윗 답변의 두번째 링크의 jow의 방법을 따르시기 바랍니다.

BUILDROOT=/home/lokios/openwrt/trunk
mipsel-openwrt-linux-gcc rsa_encryp.c \
    -I$BUILDROOT/staging_dir/target-*/usr/include \
    -L$BUILDROOT/staging_dir/target-*/usr/lib \
    -Wl,-rpath-link=$BUILDROOT/staging_dir/target-*/usr/lib \
    -lcrypto -o encrypt

pcap.h의 경로는 I플래그에만 삽입해도 가능할것이나 혹 모르니 L플래그에도 넣어보시기 바랍니다.
행운을 빌게요!