【发布时间】:2016-02-17 17:52:24
【问题描述】:
我从 github 克隆了某人的 c++ 代码,但编译失败。作者告诉我,他可以用 gcc 4.8.4 成功运行它。所以我使用homebrew安装了gcc48,并在他的代码文件夹中的makefile中指定了gcc的版本。
这是 Makefile 中的设置:
CC=g++-4.8
CFLAGS=-c -pipe -O3
#INCLUDE=-I /home/xh/jianguoyun/my/code/cpp/mylib
MODEL_EXE=bbtm infer
all:$(MODEL_EXE)
bbtm:BurstyBTM.o main.o
$(CC) $^ -o $@
infer:infer.o
$(CC) $^ -o $@
mail.o:BurstyBTM.h
BurstyBTM.o:BurstyBTM.h biterm.h doc.h
infer.o:infer.h doc.h
%.o:%.cpp
$(CC) $(INCLUDE) $(CFLAGS) $< -o $@
clean:
rm -rf *.o $(MODEL_EXE)
但是在编译过程中出现错误:
g++-4.8 -c -pipe -O3 BurstyBTM.cpp -o BurstyBTM.o
BurstyBTM.cpp: In member function 'Pvec<double> BurstyBTM::compute_pz_b(Biterm&)':
BurstyBTM.cpp:129:23: error: could not convert 'pz.Pvec<T>::normalize<double>(0.0)' from 'void' to 'Pvec<double>'
return pz.normalize();
^
BurstyBTM.cpp: In member function 'void BurstyBTM::save_pz(std::string)':
BurstyBTM.cpp:158:41: error: conversion from 'void' to non-scalar type 'Pvec<double>' requested
Pvec<double> pz = nb_z.normalize(alpha);
^
BurstyBTM.cpp: In member function 'void BurstyBTM::save_pw_z(std::string)':
BurstyBTM.cpp:164:37: error: conversion from 'void' to non-scalar type 'Pmat<double>' requested
Pmat<double> pw_z = nwz.normr(beta);
^
make: *** [BurstyBTM.o] Error 1
我尝试安装 gcc49 并再次运行它,但也失败了。我猜这不是因为代码错误,因为作者说他可以毫无错误地运行它。我的操作系统是 os x 10.10。你能帮我解决这个问题吗?我对此几乎要生气了。提前谢谢!
编辑:
这是github的链接
错误代码如下:
for (int k = 1; k < K + 1; ++k) {
double deno = 2 * nb_z[k] + W * beta;
double pw1k = (nwz[k][w1] + beta) / deno;
double pw2k = (nwz[k][w2] + beta) / (deno + 1);
double pk_t = (nb_z[k] + alpha) / (nb + K * alpha);
pz[k] = eta * pk_t * pw1k * pw2k;
}
return pz.normalize();
}
void BurstyBTM::save_pz(string pt) {
Pvec<double> pz = nb_z.normalize(alpha);
pz.write(pt);
}
void BurstyBTM::save_pw_z(string pt) {
Pmat<double> pw_z = nwz.normr(beta);
pw_z.write(pt);
}
【问题讨论】:
-
发布makefile的内容而不是代码!谁能帮助您找出问题所在?
-
我们需要看一些代码。
beta或alpha是什么?他们是Pvec<double>吗? -
我认为从您的错误消息中可以看出,错误在于“BurstyBTM.cpp”中的方法。它与 Makefile 无关。
-
显然编译器认为函数
normalize和normr是用void返回类型声明的。那么,是吗?
标签: c++ gcc compilation makefile