我正在使用g ++和automake在Ubuntu 10.10下开发一个C ++应用程序。对于这个程序,我有两个cpp文件(main.cpp和forward.cpp,后者是测试类)和forward.h;我还有以下makefile:
main: \
forward.o
g++ -fPIC -g -Wall -D_REENTRANT -fno-exceptions -I/usr/local/Aria/include/ -L/usr/local/Aria/lib -lAria -lpthread -ldl -lrt \
-o simple_controller \
main.cpp \
forward.o
%.o : %.cpp
g++ -c -g -Wall -D_REENTRANT -fno-exceptions -I/usr/local/Aria/include/ $< -o $@
clean:
rm -fv *.o
rm -fv */*.o
当我将所有这四个文件复制到同一目录并从命令行(bash)调用“make”时,将调用g ++并正确编译我的程序。
好的,现在我想在Eclipse下实现同样的目标。所以我在Eclipse下创建了一个新的非托管C ++项目,这样我就可以提供自己的makefile(与上面列出的相同)。不幸的是,当我现在使用Eclipse下的“Build all”选项时,我可以看到以下控制台输出:
make
make: *** No rule to make target `forward.o', needed by `main'. Stop.
由于我不熟悉Linux下的C ++开发,使用g ++和makefile,我真的不明白这个问题。我认为正确编译我的应用程序所需的一切都是在makefile中编写的,因为它在命令行中运行良好。但似乎我无法将相同的makefile 1:1复制到我的Eclipse项目中。
我在这里缺少什么想法? 在此先感谢您的帮助!
答案 0 :(得分:1)
当你执行项目的构建时,eclipse正在执行make all命令,因此你需要修改你的项目以使用main而不是所有目标eclipse使用,或者将所有规则添加到你的makefile引用回到主要规则。另外,我还会在clean步骤下添加一个命令来删除可执行文件。
修改后的Makefile:
main: \
forward.o
g++ -fPIC -g -Wall -D_REENTRANT -fno-exceptions -I/usr/local/Aria/include/ - L/usr/local/Aria/lib -lAria -lpthread -ldl -lrt \
-o simple_controller \
main.cpp \
forward.o
%.o : %.cpp
g++ -c -g -Wall -D_REENTRANT -fno-exceptions -I/usr/local/Aria/include/ $< -o $@
clean:
rm -fv *.o
rm -fv */*.o
rm -fv simple_controller
all: main
答案 1 :(得分:1)
好的,我现在发现了问题 - Eclipse将makefile放入另一个目录,而不是所有源代码文件所在的“src”文件夹。因此make没有找到编译所需的.cpp和.h文件。现在我最终得到了这样的东西:
...
forward.o : ../src/forward.cpp ../src/forward.h
...
有没有办法告诉make,即使没有明确说明,它也应该查看文件夹../src?
答案 2 :(得分:0)
您可以告诉make使用-C选项更改目录。
例如,如果您的源位于src /并且您的makefile位于src /的父目录中,您只需执行以下操作:
make -C ..
注意 - 从未特别使用Eclipse,但通常有一种方法可以添加命令行开关和放大器。 IDE选项中某处的构建命令的选项。
(根据你问题的第二部分回答,你指定问题是makefile与你的源文件位于不同的文件夹中。)