C ++ newbie here我的命令g++ main.cpp -o main
给了我链接错误,如下所示
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)
如果我传递c ++文件g++ main.cpp myfile.cpp -o main
一切正确
如何编译多个c ++文件而不在命令行中传递所有内容。
由于
答案 0 :(得分:1)
如何编译多个c ++文件而不在命令行中传递所有内容。
要构建应用程序,您需要所有目标文件,因此必须将所有cpp文件传递给编译器。
但是对于所有cpp文件都保留在单个文件夹的简单情况,你可以 使用命令(简单但缓慢的方法):
g++ *.cpp -o main
答案 1 :(得分:1)
如何编译多个c ++文件而不在命令行中传递所有内容。
首先创建目标文件:
g++ -c main.cpp -o main.o
g++ -c myfile.cpp -o myfile.o
然后将它们传递给链接器:
g++ main.o myfile.o -o main
答案 2 :(得分:1)
虽然Make的学习曲线相当大,但make文件是首选解决方案。在SO上,我也注意到了CMake的重要用途。
Makefile的其他想法:
以下两条规则处理了90%的简单单元测试可执行文件:
R01处理同时包含.cc和.hh
R02只处理.cc
# pattern rule R01
# when any ARCHIVE changes, trigger a rebuild
% : %.cc %.hh $(LIB_ARCHIVEs)
@echo
@echo R01: $<
rm -f $@
$(CC) $(CC_FLAGS) $< -o $@ $(LIB_DIRs) $(LIB_NMs)
# pattern rule R02
# when any ARCHIVE changes, trigger a rebuild
% : %.cc $(LIB_ARCHIVEs)
@echo
@echo R02: $<
rm -f $@
$(CC) $(CC_FLAGS) $< -o $@ $(LIB_DIRs) $(LIB_NMs)
有时,我会将特定的LIB名称和目录...直接添加到Makefile中的LIB_DIRs和LIB_NMs定义中。例如,我在这里添加了-lrt和-pthread:
LIB_NMs += -lbag_i686 -lposix_i686 -lrt -pthread
bag_i686和posix_i686是我构建的库...围绕linux和posix函数的简单C ++类包装器。我的大多数单元测试都没有使用很多posix的东西,但我不会感到悲伤,包括它。
使用C ++ std :: thread,我很少使用-pthread。但是,我偶尔会使用posix信号量。
我的编译命令行访问(在Ubuntu上的emacs中)提供了一个历史记录,因此偶尔更改或添加命令行只是一个“烦恼”。一度。从那时起,历史上就可以使用更新的命令。
我推出的emacs配置了一个&#39; embedded&#39;预定义的编译命令:
USER_FLAGS='-O0 ' ; export USER_FLAGS ; time make CC='g++ -m64' -j 2 -k
此命令显示我第一次从emacs中启动编译器。 Emacs将其呈现为命令已经在&#39; compile-command history&#39;。
中如果我没有重建所有内容,我会手动缩短这一点,通常我只会构建一个单独的:
USER_FLAGS='-O0 ' ; export USER_FLAGS ; time make CC='g++ -m64'
所以,例如,当我准备编译dumy431.cc时,我调用:
USER_FLAGS='-O0 ' ; export USER_FLAGS ; time make CC='g++ -m64' dumy431
我启动的下一个构建(从emacs编译中)从上一个命令开始,向上/向下箭头滚动浏览该命令的任何其他版本。
使用这种形式的命令,我可以通过插入&#34; clan&#34;来简单地从g ++改为clang ++。在适当的地方:
USER_FLAGS='-O0 ' ; export USER_FLAGS ; time make CC='clang++ -m64'
clang ++经常提供g ++不报告的其他诊断。要回滚到g ++,我可以在编译器命令面板中向上箭头(或编辑命令)。
这是一个小例子,我的单元测试代码有多个src文件。通常,非主文件(例如eng_format。*)是我计划捕获到我的一个库以供将来使用的代码:
FMssb.o : FMssb.cc FMssb.hh
@echo
@echo R_FMssb.o: $<
rm -f $@
$(CC) $(CC_FLAGS) -c $< -o $@
FMssb_ut : FMssb_ut.cc eng_format.o FMssb.o $(LIB_ARCHIVEs)
@echo
@echo R_FMssb_ut: $<
rm -f $@
$(CC) $(CC_FLAGS) $< -o $@ eng_format.o FMssb.o $(LIB_DIRs) $(LIB_NMs)
eng_format.o : eng_format.cpp eng_format.hpp $(LIB_ARCHIVEs)
@echo
@echo R_EF: $<
rm -f $@
$(CC) $(CC_FLAGS) -c $< -o $@ $(LIB_DIRs) $(LIB_NMs)