“交叉兼容”代码在Linux中吐出错误并在Windows上编译好! (GLM)

时间:2013-08-01 04:47:26

标签: c++ compiler-errors g++ ubuntu-12.04

我真的很惊讶,今天我下载了Ubuntu 12 LTS 32bit并且安装了构建必备。

然后我为我的项目创建了一个makefile,我只是从互联网上的另一个项目中复制粘贴并编辑了一下以启用C ++ 11的东西,如果它需要GLM的东西?

无论如何makefile:

GPP = g++
GCC = gcc
plugin_OUTFILE = "./QuaternionStuff.so"

COMPILE_FLAGS = -std=c++0x -m32 -O3 -fPIC -c -I ./ -w -D LINUX -D PROJECT_NAME=\"plugin\"

plugin = -D plugin $(COMPILE_FLAGS)

all: plugin

clean:
    -rm -f *~ *.o *.so

plugin: clean
    $(GPP) $(plugin) ./*.cpp
    $(GPP) -std=c++0x -m32 --static -fshort-wchar -shared -o $(plugin_OUTFILE) *.o

现在,当我运行它时,linux吐出错误,我真的不理解它们。

现在,代码可以在windows上运行,编译得很好,具有最高警告级别等,这很好!

但是g ++程序对此并不满意:

no matching function for call to ‘GetPitchYawBetweenCoords(glm::vec3, glm::vec3, glm::vec2&)’
note: glm::vec2 GetPitchYawBetweenCoords(glm::vec3&, glm::vec3&)
note:   candidate expects 2 arguments, 3 provided

//prototypes:
inline glm::vec2 GetPitchYawBetweenCoords(glm::vec3 &source, glm::vec3 &target);
inline void GetPitchYawBetweenCoords(glm::vec3 &source, glm::vec3 &target, glm::vec2 &output);

代码,带有调用它的相应函数:

//the call
inline void AmxSetVector3(AMX * amx, cell * &params, unsigned char startpos, glm::vec3 vector)
{
    //some code here
}

inline void AmxSetVector2Inverse(AMX * amx, cell * &params, unsigned char startpos, glm::vec2 vector)
{
    //some code here
}

static cell AMX_NATIVE_CALL GetPitchYawBetweenPositions( AMX* amx, cell* params )
{
    glm::vec2 rot;
    GetPitchYawBetweenCoords(AmxGetVector3(params,1),AmxGetVector3(params,4),rot);
    AmxSetVector2Inverse(amx,params,7,rot);
    return 1;
}

如何区分这两个非常不同的功能(原型)? 这是所有错误中最令人困惑的部分,但还有更多:(

我没有看到任何错误。

所以,我所做的是:我改变(因为现在我的代码变得怪异,因为我需要改变一切只是为了分配Linux)这些函数到不同的名字,我只是添加一个'R'到了第二个原型的结束,但随后又出现了大量的错误..

In function ‘cell SomeFunction(AMX*, cell*)’:
error: invalid initialization of non-const reference of type ‘glm::vec3& 
{aka glm::detail::tvec3<float>&}’ from an rvalue of type ‘glm::detail::tvec3<float>’

再次......在同一个函数上......:

static cell AMX_NATIVE_CALL GetPitchYawBetweenPositions( AMX* amx, cell* params )
{
    glm::vec2 rot;
    GetPitchYawBetweenCoords(AmxGetVector3(params,1),AmxGetVector3(params,4),rot);
    AmxSetVector2Inverse(amx,params,7,rot);//HERE
    return 1;
}

发生了什么事?我不知道如何解决这个问题。

G ++版本是4.6

1 个答案:

答案 0 :(得分:1)

显然,AmxGetVector3会返回glm::detail::tvec3<float> 根据标准,此临时对象不能绑定到非const引用(这是第二条消息试图告诉您的内容)。

不幸的是,Visual C ++有一个愚蠢的非标准扩展,默认启用,允许这种绑定。

将您的函数更改为具有这些(const-correct)原型:

inline glm::vec2 GetPitchYawBetweenCoords(const glm::vec3 &source, const glm::vec3 &target);
inline void GetPitchYawBetweenCoords(const glm::vec3 &source, const glm::vec3 &target, glm::vec2 &output);