编译器错误,同时构建使用Eigen,C ++模板库的线性代数的项目 [英] Compiler errors while building a project which uses Eigen, the C++ template library for linear algebra

查看:878
本文介绍了编译器错误,同时构建使用Eigen,C ++模板库的线性代数的项目的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

在我的项目中,当我为ARM NEON打开矢量化标志(mfpu = neon -mfloat-abi = softfp)时,我使用了线性代数的Eigen C ++库和 ONLY 获取编译器错误。我不能理解错了什么。我需要在Eigen库中为ARM NEON启用任何预处理器指令吗?






main.c

 #include< iostream> 
#include< Eigen / Core>

//导入最常见的特征类型
使用命名空间Eigen;

int main(int,char * [])
{
Matrix4f m3;
m3< 1,2,3,0,4,5,6,0,7,8,9,0,0,0,0,
Matrix4f m4;

asm(#begins here);
m4 = m3 * m3;
asm(#ends here);

std :: cout<< m3 \\\
< m3 < \\\
m4:\\\

<< m4 < std :: endl;

std :: cout<< DONE !!;
}



makefile

  main:main.cpp 
g ++ -mfpu = neon -mfloat-abi = softfp -I / home / ubuntu / Documents / eigen / main.cpp -o main

错误

  ubuntu @ ubuntu-desktop:〜/ Documents / mat_mul $ make 
g ++ -mfpu = neon -mfloat-abi = softfp -I / home / ubuntu / Documents / eigen / main.cpp -o main
文件包括从/ home / ubuntu / Documents / eigen / Eigen / Core:227,
从main.cpp:2:
/ home / ubuntu / Documents / eigen / Eigen / src / Core / NEON / PacketMath.h:在函数'typename Eigen :: ei_packet_traits< T> :: type Eigen :: ei_pload(const Scalar *)[with Scalar = float]':
/ home / ubuntu / Documents / Eigen / src / Core / arch / NEON / PacketMath.h:163:错误:无法将参数'1'的'const float *'转换为'const float32_t *'至'__builtin_neon_sf __vector__ vld1q_f32(const float32_t *)'
/home/ubuntu/Documents/eigen/Eigen/src/Core/arch/NEON/PacketMath.h:在函数'typename Eigen :: ei_packet_traits< T> :: type Eigen :: ei_ploadu(const Scalar *)[with Scalar = float]':
/home/ubuntu/Documents/eigen/Eigen/src/Core/arch/NEON/PacketMath.h:166:错误:无法将'const float *'转换为'const float32_t *'for参数'1'到'__builtin_neon_sf __vector__ vld1q_f32(const float32_t *)'
/home/ubuntu/Documents/eigen/Eigen/src/Core/arch/NEON/PacketMath.h:在函数'void Eigen :: ei_pstore (Scalar *,const Packet&)[with Scalar = float,Packet = __builtin_neon_sf __vector__]':
/home/ubuntu/Documents/eigen/Eigen/src/Core/arch/NEON/PacketMath.h:169:错误:不能将'float *'转换为'float32_t *'为参数'1'到'void vst1q_f32(float32_t *,__builtin_neon_sf __vector__)'
/ home / ubuntu / Documents / eigen / Eigen / src / Core / arch /NEON/PacketMath.h:在函数'void Eigen :: ei_pstoreu(Scalar *,const Packet&)[with Scalar = float,Packet = __builtin_neon_sf __vector__]':
/ home / ubuntu / Documents / eigen / Eigen /src/Core/arch/NEON/PacketMath.h:172:错误:无法将参数'1'的'float *'转换为'float32_t *'转换为'void vst1q_f32(float32_t *,__builtin_neon_sf __vector__)'
/ home / ubuntu / Documents / eigen / Eigen / src / Core / arch / NEON / PacketMath.h:在函数'typename Eigen :: ei_unpacket_traits :: type Eigen :: ei_pfirst(const Packet&)[with Packet = __builtin_neon_sf __vector__]':
/home/ubuntu/Documents/eigen/Eigen/src/Core/arch/NEON/PacketMath.h:179:错误:无法将参数'1的'float *'转换为'float32_t *' 'to'void vst1q_f32(float32_t *,__builtin_neon_sf __vector__)'
/home/ubuntu/Documents/eigen/Eigen/src/Core/arch/NEON/PacketMath.h:在函数'typename Eigen :: ei_unpacket_traits< T> ; :: type Eigen :: ei_predux(const Packet&)[with Packet = __builtin_neon_sf __vector__]':
/home/ubuntu/Documents/eigen/Eigen/src/Core/arch/NEON/PacketMath.h:216 :错误:不能将'float *'转换为'float32_t *'为参数'1'到'void vst1_f32(float32_t *,__builtin_neon_sf __vector__)'
/ home / ubuntu / Documents / eigen / arch / NEON / PacketMath.h:在函数'typename Eigen :: ei_unpacket_traits :: type Eigen :: ei_predux_mul(const Packet&)[with Packet = __builtin_neon_sf __vector__]':
/ home / ubuntu / Documents /eigen/Eigen/src/Core/arch/NEON/PacketMath.h:289:错误:无法将参数'1'的'float *'转换为'float32_t *'至'void vst1_f32(float32_t *,__builtin_neon_sf __vector__)'
/home/ubuntu/Documents/eigen/Eigen/src/Core/arch/NEON/PacketMath.h:在函数'typename Eigen :: ei_unpacket_traits< T> :: type Eigen :: ei_predux_min(const Packet& with Packet = __builtin_neon_sf __vector__]':
/home/ubuntu/Documents/eigen/Eigen/src/Core/arch/NEON/PacketMath.h:320:错误:无法将'float *'转换为'float32_t *'将参数'1'改为'void vst1_f32(float32_t *,__builtin_neon_sf __vector__)'
/home/ubuntu/Documents/eigen/Eigen/src/Core/arch/NEON/PacketMath.h:在函数'typename Eigen: :ei_unpacket_traits< T> :: type Eigen :: ei_predux_max(const Packet&)[with packet = __builtin_neon_sf __vector__]':
/ home / ubuntu / Documents / eigen / Eigen / src / Core / arch / NEON / PacketMath .h:348:错误:无法将参数'1'的'float *'转换为'float32_t *'转换为'void vst1_f32(float32_t *,__builtin_neon_sf __vector__)'
make:*** [main] b $ b ubuntu @ ubuntu-desktop:〜/ Documents / mat_mul $






我使用Code Sourcery工具链时出现的错误

  ubuntu @ ubuntu-desktop:〜/ Documents / CodeSourcery_WS / Test_Eigen $ make 
/ home / ubuntu / CodeSourcery / Sourcery_G ++ / bin / arm-none-linux-gnueabi-c ++ -mfpu = neon -mfloat-abi = softfp -I / home / ubuntu / Documents / eigen / main。 cpp -o main
在main.cpp中包含的文件中:1:
/home/ubuntu/CodeSourcery/Sourcery_G++/bin/../lib/gcc/arm-none-linux-gnueabi/4.4。 1 /../../../../ arm-none-linux-gnueabi / include / c ++ / 4.4.1 / iostream:39:致命错误:bits / c ++ config.h:没有这样的文件或目录
编译终止。
make:*** [main]错误1


解决方案

看起来像gcc的错误,它真的应该混合float和float32_t没有错误。请检查



编辑:这已经在CodeSourcery工具链中修复。这是来自发行说明:


使用float32_t编译器错误。修复了导致
使用arm_neon.h中的
float32_t类型时的编译器错误。



in my project I'm making use of Eigen C++ library for linear algebra and ONLY when I turn on the vectorization flags (mfpu=neon -mfloat-abi=softfp) for ARM NEON, I get compiler errors. I'm not able to understand whats going wrong. Do I need to enable any preprocessor directives for ARM NEON in the Eigen Library?


main.c

#include<iostream>
#include <Eigen/Core>

// import most common Eigen types
using namespace Eigen;

int main(int, char *[])
{
    Matrix4f m3;
    m3 << 1, 2, 3, 0, 4, 5, 6, 0, 7, 8, 9, 0, 0, 0, 0, 0;
    Matrix4f m4;

    asm("#begins here");
    m4 = m3*m3;
    asm("#ends here");

    std::cout << "m3\n" << m3 << "\nm4:\n"
        << m4 << std::endl;

    std::cout << "DONE!!";
}

makefile

main: main.cpp
    g++ -mfpu=neon -mfloat-abi=softfp -I /home/ubuntu/Documents/eigen/ main.cpp -o main

errors

 ubuntu@ubuntu-desktop:~/Documents/mat_mul$ make
g++ -mfpu=neon -mfloat-abi=softfp -I /home/ubuntu/Documents/eigen/ main.cpp -o main
In file included from /home/ubuntu/Documents/eigen/Eigen/Core:227,
                 from main.cpp:2:
/home/ubuntu/Documents/eigen/Eigen/src/Core/arch/NEON/PacketMath.h: In function ‘typename Eigen::ei_packet_traits<T>::type Eigen::ei_pload(const Scalar*) [with Scalar = float]’:
/home/ubuntu/Documents/eigen/Eigen/src/Core/arch/NEON/PacketMath.h:163: error: cannot convert ‘const float*’ to ‘const float32_t*’ for argument ‘1’ to ‘__builtin_neon_sf __vector__ vld1q_f32(const float32_t*)’
/home/ubuntu/Documents/eigen/Eigen/src/Core/arch/NEON/PacketMath.h: In function ‘typename Eigen::ei_packet_traits<T>::type Eigen::ei_ploadu(const Scalar*) [with Scalar = float]’:
/home/ubuntu/Documents/eigen/Eigen/src/Core/arch/NEON/PacketMath.h:166: error: cannot convert ‘const float*’ to ‘const float32_t*’ for argument ‘1’ to ‘__builtin_neon_sf __vector__ vld1q_f32(const float32_t*)’
/home/ubuntu/Documents/eigen/Eigen/src/Core/arch/NEON/PacketMath.h: In function ‘void Eigen::ei_pstore(Scalar*, const Packet&) [with Scalar = float, Packet = __builtin_neon_sf __vector__]’:
/home/ubuntu/Documents/eigen/Eigen/src/Core/arch/NEON/PacketMath.h:169: error: cannot convert ‘float*’ to ‘float32_t*’ for argument ‘1’ to ‘void vst1q_f32(float32_t*, __builtin_neon_sf __vector__)’
/home/ubuntu/Documents/eigen/Eigen/src/Core/arch/NEON/PacketMath.h: In function ‘void Eigen::ei_pstoreu(Scalar*, const Packet&) [with Scalar = float, Packet = __builtin_neon_sf __vector__]’:
/home/ubuntu/Documents/eigen/Eigen/src/Core/arch/NEON/PacketMath.h:172: error: cannot convert ‘float*’ to ‘float32_t*’ for argument ‘1’ to ‘void vst1q_f32(float32_t*, __builtin_neon_sf __vector__)’
/home/ubuntu/Documents/eigen/Eigen/src/Core/arch/NEON/PacketMath.h: In function ‘typename Eigen::ei_unpacket_traits<T>::type Eigen::ei_pfirst(const Packet&) [with Packet = __builtin_neon_sf __vector__]’:
/home/ubuntu/Documents/eigen/Eigen/src/Core/arch/NEON/PacketMath.h:179: error: cannot convert ‘float*’ to ‘float32_t*’ for argument ‘1’ to ‘void vst1q_f32(float32_t*, __builtin_neon_sf __vector__)’
/home/ubuntu/Documents/eigen/Eigen/src/Core/arch/NEON/PacketMath.h: In function ‘typename Eigen::ei_unpacket_traits<T>::type Eigen::ei_predux(const Packet&) [with Packet = __builtin_neon_sf __vector__]’:
/home/ubuntu/Documents/eigen/Eigen/src/Core/arch/NEON/PacketMath.h:216: error: cannot convert ‘float*’ to ‘float32_t*’ for argument ‘1’ to ‘void vst1_f32(float32_t*, __builtin_neon_sf __vector__)’
/home/ubuntu/Documents/eigen/Eigen/src/Core/arch/NEON/PacketMath.h: In function ‘typename Eigen::ei_unpacket_traits<T>::type Eigen::ei_predux_mul(const Packet&) [with Packet = __builtin_neon_sf __vector__]’:
/home/ubuntu/Documents/eigen/Eigen/src/Core/arch/NEON/PacketMath.h:289: error: cannot convert ‘float*’ to ‘float32_t*’ for argument ‘1’ to ‘void vst1_f32(float32_t*, __builtin_neon_sf __vector__)’
/home/ubuntu/Documents/eigen/Eigen/src/Core/arch/NEON/PacketMath.h: In function ‘typename Eigen::ei_unpacket_traits<T>::type Eigen::ei_predux_min(const Packet&) [with Packet = __builtin_neon_sf __vector__]’:
/home/ubuntu/Documents/eigen/Eigen/src/Core/arch/NEON/PacketMath.h:320: error: cannot convert ‘float*’ to ‘float32_t*’ for argument ‘1’ to ‘void vst1_f32(float32_t*, __builtin_neon_sf __vector__)’
/home/ubuntu/Documents/eigen/Eigen/src/Core/arch/NEON/PacketMath.h: In function ‘typename Eigen::ei_unpacket_traits<T>::type Eigen::ei_predux_max(const Packet&) [with Packet = __builtin_neon_sf __vector__]’:
/home/ubuntu/Documents/eigen/Eigen/src/Core/arch/NEON/PacketMath.h:348: error: cannot convert ‘float*’ to ‘float32_t*’ for argument ‘1’ to ‘void vst1_f32(float32_t*, __builtin_neon_sf __vector__)’
make: *** [main] Error 1
ubuntu@ubuntu-desktop:~/Documents/mat_mul$ 


Errors I got when I used Code Sourcery toolchain

ubuntu@ubuntu-desktop:~/Documents/CodeSourcery_WS/Test_Eigen$ make
/home/ubuntu/CodeSourcery/Sourcery_G++/bin/arm-none-linux-gnueabi-c++ -mfpu=neon -mfloat-abi=softfp -I /home/ubuntu/Documents/eigen/ main.cpp -o main
In file included from main.cpp:1:
/home/ubuntu/CodeSourcery/Sourcery_G++/bin/../lib/gcc/arm-none-linux-gnueabi/4.4.1/../../../../arm-none-linux-gnueabi/include/c++/4.4.1/iostream:39: fatal error: bits/c++config.h: No such file or directory
compilation terminated.
make: *** [main] Error 1

解决方案

Looks like gcc bug, it really should mix float and float32_t without errors. Check this out.

Edit: This has been fixed in CodeSourcery toolchain. This is from release notes:

Compiler errors with float32_t. A bug has been fixed that caused compiler errors when using the float32_t type from arm_neon.h.

这篇关于编译器错误,同时构建使用Eigen,C ++模板库的线性代数的项目的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆