未定义的引用链接错误静态库交叉编译为beagle bone black

时间:2014-10-25 06:42:10

标签: c++ linker embedded arm cross-compiling

在我的centos机器上交叉编译Beagle Bone Black。

我正在创建一个应用程序' BasicComponentsTest.cpp'它使用' SimFrameProducer'我已经创建并构建到静态库中的类,即' libspu.a'。请参阅下面的makefile和代码以供参考。

使用' libspu.a'编译主应用程序时出现链接错误静态链接一个库,但是当我直接链接对象时它工作正常(参见直接对象makefile),即它只在用我创建的静态库编译时失败,显然SPU对象编译正常并创建静态库文件&# 39; libspu.a'

我唯一能想到的可能是错误的是' ar'命令对于交叉编译对象不能正常工作,这是正确的吗?我有没有其他原因得到这个错误?顺便说一下,我还是c ++的新手。

[root@CVDEV 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
[root@CVDEV 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() {

}

Makefile main BasicComponentsTest应用程序

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

Makefile链接直接对象而不是静态库

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

SPU lib的Makefile

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  

2 个答案:

答案 0 :(得分:0)

您的存档缺少对象文件索引ar命令行应为:

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

您错过了s选项,使您的存档只是文件中的文件集合(存档 - 不仅仅是库 - 不过它总是用于它),而不是< EM>文库

答案 1 :(得分:0)

发现问题是我在构建它时放置静态库的顺序,显然静态库被排除,因为它被编译器认为没有使用,当你把它放在c ++文件后它意识到它需要它并使用它。 此帖子的所有学分

c++ undefined references with static library

将我的代码更改为以下内容以使其正常工作

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