多个链接c ++文件

时间:2016-09-28 15:41:45

标签: c++ linker

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 ++文件而不在命令行中传递所有内容。

由于

3 个答案:

答案 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)