2014-10-25 1 views
1

내 centos 컴퓨터에서 Beagle Bone Black에 대한 크로스 컴파일.정의되지 않은 refrence 링크 오류 beagle bone black에 대한 정적 라이브러리 크로스 컴파일

내가 만든 'SimFrameProducer'클래스를 사용하는 'BasicComponentsTest.cpp'응용 프로그램을 만들면 정적 라이브러리, 즉 'libspu.a'에 내장됩니다. 참조 용으로 makefile 및 코드를 참조하십시오.

'libspu.a'를 사용하여 라이브러리를 정적으로 링크 할 때 링크 오류가 발생하지만 객체를 직접 링크 할 때 제대로 작동합니다 (직접 객체 메이크 파일 참조). 즉 static으로 컴파일 할 때만 실패합니다 라이브러리를 만들었습니다. 분명히 SPU 객체는 잘 컴파일되고 정적 라이브러리 파일 'libspu.a'를 생성합니다.

'ar'명령이 교차 컴파일 된 개체에 제대로 작동하지 않는다고 생각할 수있는 유일한 방법은 맞습니까? 이 오류가 발생하는 다른 이유가 있습니까? BTW 나는 여전히 C++을 처음 사용합니다.

[[email protected] SPU]# make 
make: Warning: File `Makefile' has modification time 3.6e+04 s in the future 
/opt/gcc-linaro-arm-linux-gnueabihf-4.8-2014.04_linux/bin/arm-linux-gnueabihf-g++ -Wall -I ../../SPU/Include -L ../../SPU -lspu BasicComponentsTest.cpp -o Test1 
/tmp/cc6Ck7Xj.o: In function `main': 
BasicComponentsTest.cpp:(.text+0x1e): undefined reference to `SimFrameProducer::SimFrameProducer(char*)' 
collect2: error: ld returned 1 exit status 
make: *** [all] Error 1 
[[email protected] SPU]# 

BasicCompontentsTest.cpp 기본 응용 프로그램 파일

#include <cstdlib> 
#include "SimFrameProducer.h" 
using namespace std; 

/* 
* 
*/ 
int main(int argc, char** argv) { 
    SimFrameProducer* prod = new SimFrameProducer((char*)"Test1"); 

    prod->Start(); 
    prod->Stop(); 

    delete prod; 

    return 0; 
} 

SimFrameProducer.h

#include "SPUBase.h" 
#include "SPUFrameProducer.h" 

class SimFrameProducer:public SPUFrameProducer, public SPUBase { 
public: 
    SimFrameProducer(char* instanceId); 
    virtual ~SimFrameProducer(); 
    void Start(); 
    void Stop(); 
private: 

}; 

SimFrameProducer.cpp

#include "SimFrameProducer.h" 
#include "Include/SimFrameProducer.h" 


SimFrameProducer::SimFrameProducer(char* instanceId):SPUBase((char*)"TYPE_SAMPLE", instanceId) { 

} 

void SimFrameProducer::Start(){ 

} 

void SimFrameProducer::Stop(){ 

} 

SimFrameProducer::~SimFrameProducer() { 

} 

메이크 주요 BasicComponentsTest 응용 제품 이온은 SPU lib 디렉토리에 대한 정적 라이브러리

CC=/opt/gcc-linaro-arm-linux-gnueabihf-4.8-2014.04_linux/bin/arm-linux-gnueabihf-g++ 
SPU_PATH=../../SPU 
INC=-I $(SPU_PATH)/Include 
LIB=-L $(SPU_PATH) 

OBJS=$(SPU_PATH)/SPUBase.o \ 
$(SPU_PATH)/SPUFrame.o \ 
$(SPU_PATH)/SPUFrameProducer.o \ 
$(SPU_PATH)/FFTFrameProducer.o \ 
$(SPU_PATH)/SimFrameProducer.o 

## Target: all 
all: 
    $(CC) -Wall $(INC) $(OBJS) BasicComponentsTest.cpp -o Test1 

메이크 대신 직접 객체를 연결

CC=/opt/gcc-linaro-arm-linux-gnueabihf-4.8-2014.04_linux/bin/arm-linux-gnueabihf-g++ 
SPU_PATH=../../SPU 
INC=-I $(SPU_PATH)/Include 
LIB=-L $(SPU_PATH) 

all: 
    $(CC) -Wall $(INC) $(LIB) -lspu BasicComponentsTest.cpp -o Test1 

메이크

CC=/opt/gcc-linaro-arm-linux-gnueabihf-4.8-2014.04_linux/bin/arm-linux-gnueabihf-g++ 
INC=-I Include 
## Target: all 
all: 
    $(CC) -Wall $(INC) -c SPUBase.cpp 
    $(CC) -Wall $(INC) -c SPUFrame.cpp 
    $(CC) -Wall $(INC) -c SPUFrameProducer.cpp 
    $(CC) -Wall $(INC) -c FFTFrameProducer.cpp 
    $(CC) -Wall $(INC) -c SimFrameProducer.cpp 
    ar cr libspu.a SPUBase.o SPUFrame.o SPUFrameProducer.o FFTFrameProducer.o SimFrameProducer.o 
+0

일하러 가야 다음에 내 코드를 변경 아카이브 유틸리티'ar'이 조금 더 하나의 파일로 여러 파일을 결합하는 않습니다. 그것은 당신의 문제의 원인이 아닙니다. make 파일이 주어지면 정적 라이브러리는'../../SPU/libspu '여야합니다.그 사건인가? – Clifford

+0

예, 컴파일/링크에서 파일을 찾을 수 없습니다. –

+0

왜 십자형 툴 체인과 함께 제공되는 ar 명령을 사용하지 않습니까? 귀하의 호스트 ar이 귀하의 목표 아키텍처를 지원하더라도 (그것은 그렇습니까?), 귀하의 목표 아키텍처와 다른 버전 일 수 있습니다. – unixsmurf

답변

0

보관 파일은 객체 파일 인덱스 없다. ar 명령 행은 다음과 같습니다

ar rcs libspu.a SPUBase.o SPUFrame.o SPUFrameProducer.o FFTFrameProducer.o SimFrameProducer.o

당신은 (아카이브 파일에 아카이브를 파일의 바로 컬렉션을 만드는 s 옵션 누락 된 - AR 그냥 라이브러리 아니다 - 그것은 변함없이 무엇을 비록 그것은 라이브러리 대신에 사용됩니다).

+0

나는 당신에게 제안을 시도했지만, 나는 여전히 같은 문제를 겪고있다. –

+0

Windows 8 머신에서 NFS 공유를 실행 중입니까, 문제 일 수 있습니까? –

+0

@BerabenSystems : 동일한 경로의 헤더 파일에 액세스 한 것 같지 않습니다. – Clifford

0

빌드 할 때 정적 라이브러리를 놓는 순서가 문제라는 것을 알았습니다. 정적 라이브러리는 사용되지 않는 컴파일러에 의해 인식 되었기 때문에 제외되었습니다. C++ 파일 뒤에 넣으면 그 라이브러리가 인식됩니다. 그것을 필요로하고 그것을 사용합니다. 이 게시물

c++ undefined references with static library

에 모든 학점은

$(CC) -Wall -o Test1 $(INC) $(LIB) BasicComponentsTest.cpp -lspu