내 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
일하러 가야 다음에 내 코드를 변경 아카이브 유틸리티'ar'이 조금 더 하나의 파일로 여러 파일을 결합하는 않습니다. 그것은 당신의 문제의 원인이 아닙니다. make 파일이 주어지면 정적 라이브러리는'../../SPU/libspu '여야합니다.그 사건인가? – Clifford
예, 컴파일/링크에서 파일을 찾을 수 없습니다. –
왜 십자형 툴 체인과 함께 제공되는 ar 명령을 사용하지 않습니까? 귀하의 호스트 ar이 귀하의 목표 아키텍처를 지원하더라도 (그것은 그렇습니까?), 귀하의 목표 아키텍처와 다른 버전 일 수 있습니다. – unixsmurf