Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/136.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 未定义引用链接错误beagle bone black的静态库交叉编译_C++_Linker_Embedded_Arm_Cross Compiling - Fatal编程技术网

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

C++ 未定义引用链接错误beagle bone black的静态库交叉编译,c++,linker,embedded,arm,cross-compiling,C++,Linker,Embedded,Arm,Cross Compiling,在我的centos机器上交叉编译Beagle Bone Black 我正在创建一个应用程序“BasicComponentsTest.cpp”,它使用我创建的“SimFrameProducer”类,并将其内置到一个静态库中,即“libspu.a”。请参见下面的makefile和代码以供参考 使用“libspu.a”静态链接库编译主应用程序时出现链接错误,但是当我直接链接对象(请参阅direct object makefile)时,它工作正常,即仅在使用我创建的静态库编译时失败,显然,SPU对象编译

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

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

使用“libspu.a”静态链接库编译主应用程序时出现链接错误,但是当我直接链接对象(请参阅direct object 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]#
BasicComponentTest.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.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主基本组件测试应用程序

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库的生成文件

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++文件之后,它就意识到它需要它并使用它。 这篇文章的所有学分

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

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

存档实用程序ar仅能将多个文件合并到一个文件中。这不是你问题的原因。给定make文件,您的静态库必须是
。/../SPU/libspu.a
-是这样吗?是的,我没有在compile/link中获取文件未找到错误为什么您不使用随交叉工具链提供的ar命令?即使您的主机ar支持您的目标体系结构(是吗?),它的版本也可能不同于您的交叉ar。我尝试过您的建议,但我仍然遇到相同的问题。它在windows 8计算机的NFS共享上运行,这可能是一个问题吗?@BerabenSystems:似乎不太可能,因为它以相同的路径访问了头文件。
$(CC) -Wall -o Test1 $(INC) $(LIB)  BasicComponentsTest.cpp -lspu