gpt4 book ai didi

c++ - beagle bone black 的 undefined reference 链接器错误静态库交叉编译

转载 作者:太空宇宙 更新时间:2023-11-04 13:44:26 26 4
gpt4 key购买 nike

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

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

在使用“libspu.a”静态链接库编译主应用程序时出现链接错误,但是当我直接链接对象时它工作正常(参见直接对象 makefile)即它仅在使用静态库编译时失败我创建的 SPU 对象显然可以正常编译并创建静态库文件“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 主要 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 库的 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

最佳答案

您的存档缺少目标文件索引ar 命令行应该是:

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

你错过了 s 选项,使你的存档只是文件中文件的集合(存档 - ar 不仅用于库 - 尽管它总是用于什么)而不是比一个图书馆

关于c++ - beagle bone black 的 undefined reference 链接器错误静态库交叉编译,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26559966/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com