为什么让忽略我的修改
Why does make ignore my modifications?
我正在尝试使用E²LSH,这是手册。当未标记时,该库的文件夹有一个Makefile、一个bin文件夹和一个源文件夹(以及其他内容)。
在源文件夹中有LSHMain.cpp
,我必须修改它。
我删除了这个项目(只是为了确保我没有破坏什么),重新下载,修改文件,然后点击make,但当我运行可执行文件时,我的所有修改都消失了,只考虑原始代码!
无论是否从头开始构建项目,都会发生这种情况。
我怀疑这和bin文件夹中的脚本有关,因为我必须这样运行它:
bin/lsh argument_list
我应该更改什么?
这是Makefile(减少,因为有些东西无关紧要)
SOURCES_DIR:=sources
OBJ_DIR:=bin
OUT_DIR:=bin
TEST_DIR:=$(SOURCES_DIR)
#H_SOURCES:=`find $(SOURCES_DIR) -name "*.h"`
#CPP_SOURCES:=`find $(SOURCES_DIR) -name "*.cpp"`
#TEST_SOURCES:=`find $(TEST_DIR) -name "*.cpp"`
OBJ_SOURCES:=$(SOURCES_DIR)/BucketHashing.cpp
$(SOURCES_DIR)/Geometry.cpp
$(SOURCES_DIR)/LocalitySensitiveHashing.cpp
$(SOURCES_DIR)/Random.cpp
$(SOURCES_DIR)/Util.cpp
$(SOURCES_DIR)/GlobalVars.cpp
$(SOURCES_DIR)/SelfTuning.cpp
$(SOURCES_DIR)/NearNeighbors.cpp
LSH_BUILD:=LSHMain
TEST_BUILDS:=exactNNs
genDS
compareOutputs
genPlantedDS
GCC:=g++
OPTIONS:=-O3 -DREAL_FLOAT -DDEBUG
# -march=athlon -msse -mfpmath=sse
LIBRARIES:=-lm
#-ldmalloc
all:
bin/compile
c: compile
compile:
@mkdir -p $(OUT_DIR)
$(GCC) -o $(OUT_DIR)/$(LSH_BUILD) $(OPTIONS) $(OBJ_SOURCES) $(SOURCES_DIR)/$(LSH_BUILD).cpp $(LIBRARIES)
chmod g+rwx $(OUT_DIR)/$(LSH_BUILD)
下面是compile和lsh脚本(在bin文件夹中,Makefile与source和bin文件夹位于同一目录中):
#!/bin/bash
OUT_DIR=bin
SOURCES_DIR=sources
OBJ_SOURCES="$SOURCES_DIR/BucketHashing.cpp
$SOURCES_DIR/Geometry.cpp
$SOURCES_DIR/LocalitySensitiveHashing.cpp
$SOURCES_DIR/Random.cpp
$SOURCES_DIR/Util.cpp
$SOURCES_DIR/GlobalVars.cpp
$SOURCES_DIR/SelfTuning.cpp
$SOURCES_DIR/NearNeighbors.cpp"
TEST_BUILDS="exactNNs
genDS
compareOutputs
genPlantedDS"
defineFloat=REAL_FLOAT
g++ -o $OUT_DIR/testFloat -DREAL_FLOAT $OBJ_SOURCES $SOURCES_DIR/testFloat.cpp -lm >/dev/null 2>&1 || defineFloat=REAL_DOUBLE
OPTIONS="-O3 -D$defineFloat"
g++ -o $OUT_DIR/LSHMain $OPTIONS $OBJ_SOURCES $SOURCES_DIR/LSHMain.cpp -lm
chmod g+rwx $OUT_DIR/LSHMain
for i in $TEST_BUILDS; do
g++ -o ${OUT_DIR}/$i $OPTIONS ${SOURCES_DIR}/${i}.cpp $OBJ_SOURCES -lm; chmod g+rwx $OUT_DIR/${i};
done
lsh脚本
#!/bin/bash
dir=bin
if [ $# -le 2 ]; then
echo Usage: $0 radius data_set_file query_set_file "[successProbability]"
exit
fi
paramsFile=$2.params
if [ $# -ge 4 ]; then
# success probability supplied
$dir/lsh_computeParams $1 "$2" "$3" $4 > "$paramsFile" || exit 1
else
# success probability not supplied
$dir/lsh_computeParams $1 "$2" "$3" > "$paramsFile" || exit 1
fi
chmod g+rw "$paramsFile"
echo "R*******" >/dev/stderr
echo "R*********************" >/dev/stderr
echo "R-NN DS params computed." >/dev/stderr
echo "R*********************" >/dev/stderr
echo "R*******" >/dev/stderr
$dir/lsh_fromParams "$2" "$3" "$paramsFile"
EDIT_1
当我运行make
时,我得到:
bin/compile
sources/LocalitySensitiveHashing.cpp: In function ‘RNNParametersT readRNNParameters(FILE*)’:
sources/LocalitySensitiveHashing.cpp:62:22: warning: ignoring return value of ‘int fscanf(FILE*, const char*, ...)’, declared with attribute warn_unused_result [-Wunused-result]
(many many warnings, but no errors, I have checked that I can execute the program afterwards)
有了make c
,我得到了:
g++ -o bin/LSHMain -O3 -DREAL_FLOAT -DDEBUG sources/BucketHashing.cpp sources/Geometry.cpp sources/LocalitySensitiveHashing.cpp sources/Random.cpp sources/Util.cpp sources/GlobalVars.cpp sources/SelfTuning.cpp sources/NearNeighbors.cpp sources/LSHMain.cpp -lm
warnings
chmod g+rwx bin/LSHMain
我真的不明白为什么这不起作用。。。。
有了make compile
,我得到了:
g++ -o bin/LSHMain -O3 -DREAL_FLOAT -DDEBUG sources/BucketHashing.cpp sources/Geometry.cpp sources/LocalitySensitiveHashing.cpp sources/Random.cpp sources/Util.cpp sources/GlobalVars.cpp sources/SelfTuning.cpp sources/NearNeighbors.cpp sources/LSHMain.cpp -lm
warnings
chmod g+rwx bin/LSHMain
EDIT_2
lsh_comuteParams是这样的:
#!/bin/bash
successProbability=0.9
if [ $# -le 1 ]; then
echo Usage: $0 radius data_set_file "{query_set_file | .} [successProbability]"
exit
fi
if [ $# -ge 4 ]; then
# success probability supplied
successProbability=$4
fi
arch=`uname`
nDataSet=` wc -l "$2"`
for x in $nDataSet; do nDataSet=$x; break; done
if [ "$3" != "." ]; then
nQuerySet=` wc -l "$3"`
for x in $nQuerySet; do nQuerySet=$x; break; done
else
nQuerySet=0
fi
dimension=`head -1 "$2" | wc -w`
#echo $nDataSet $nQuerySet $dimension
if [ -e bin/mem ]; then
m=`cat bin/mem`;
elif [ "$arch" = "Darwin" ]
then
#http://discussions.apple.com/thread.jspa?threadID=1608380&tstart=0
m=`top -l 1 | grep PhysMem | awk -F "[M,]" ' {print$10 }'`
let m=m*1024*1024
echo $m > bin/mem
else
s=`free -m | grep "Mem:"`
for i in $s; do m=$i; if [ "$i" != "Mem:" ]; then break; fi; done
m=${m}000000
echo $m > bin/mem
fi
bin/LSHMain $nDataSet $nQuerySet $dimension $successProbability "$1" "$2" "$3" $m -c
我修改了这个文件:
int main(int nargs, char **args){
printf("uoon");return 0;
if(nargs < 9){
usage(args[0]);
exit(1);
}
...
}
当E²LSH没有收到正确的参数时,它就不会运行它的LSHMain(不管该文件中是否有相关的代码——这让我非常困惑,因为我认为我在main()
中已经达到了这一点)。
bin文件夹中有一个脚本,它将接管并打印与usage()
打印的消息完全相同的消息,这就是为什么我认为我正在打那个电话。函数调用位于if(nargs < 9)
内部,这让我提供了无目的的参数,这样它肯定会在不执行算法的情况下(这需要时间)落入其中。
简而言之:
为了达到执行代码source/LSHMain.cpp
的程度,必须将正确的参数传递给bin/lsh
。否则,将只执行bin/lsh
脚本,从而遮蔽在source/LSHMain.cpp
中所做的修改。
希望这个答案能让未来的用户避免这样的陷阱。特别感谢Etan Reisner,他帮助了我,并最终让我考虑删除source/LSHMain.cpp
,这让我弄清楚发生了什么。
- 为什么在我的函数类型后使用引用运算符 (&) 允许我修改它返回的值?
- 当使用我在一个函数、另一个函数中修改的数组时,在我的输出中得到一个奇怪的负数
- 为什么我的项目没有保存名称中所做的修改
- 从固定函数迁移到 GLSL OpenGL:我应该如何修改我的视图(lookAt)矩阵和透视矩阵?
- 后来,我如何修改STD ::启动策略的STD :: async
- 我在让我的代码输出整个链表时遇到问题.它只是输出我修改过的一些文本文件,而不是整个东西
- 我的类的可变参数模板构造函数无法修改我的类成员,为什么会这样?
- 绘图线在SDL2 C 中闪烁.如何修改我的游戏循环
- 当我要修改指针到常量整数时,为什么我的编译器不显示错误
- 为什么我的原始二叉搜索树被修改,即使我在另一个节点中复制了根节点
- 为什么我的变量在单独的线程中修改时没有改变?C++/boost
- 我如何使用此二叉搜索函数的修改后的最大/最小值创建新数组
- 只需修改图像的开始,而不是按照我的意愿进行修改
- 我如何修改我的C 程序以显示用户输入的单词,并使用堆栈向后
- C 多重继承 - 编译器修改我的指针
- 在 Windows 中修改文件夹时通知我的应用程序
- 即使我修改了LD_LIBRARY_PATH,也找不到我的共享库
- 'ncurses' 函数 'wgetstr' 正在修改我的变量
- 如何修改我的提升::任何类似的类
- 为什么让忽略我的修改