2016-09-28 106 views
1

C++新手我的命令是g++ main.cpp -o main给我链接像下面多重连接C++文件在这里

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

是否G ++调用铛链接? –

+0

是的上述工作,但我认为最好的办法是创建make文件 – sger

+0

既然你已经知道,一个Makefile是要走的路,你有什么问题? –

回答

1

任何想法如何编译多个C++文件,而在命令行中传递的一切。

要构建应用程序,您需要所有的目标文件,因此您必须将所有cpp文件传递给编译器。

但是当所有的CPP-文件留在一个文件夹中简单的情况下,你可以 使用命令(简单,但速度慢的方法):

g++ *.cpp -o main 
1

任何想法如何编译没有通过多个C++文件一切都在命令行中。

首先创建目标文件:

g++ -c main.cpp -o main.o 
g++ -c myfile.cpp -o myfile.o 

然后将它们传递给连接器:

g++ main.o myfile.o -o main 
+0

有时候库中链接器命令列出的顺序。你也可以阅读这篇文章:[https://stackoverflow.com/questions/45135/...](https://stackoverflow.com/questions/45135/why-does-the-order-in-which -libraries-的连接 - 有时因 - 错误 - 在-GCC) – hoelzlw

1

虽然有是做一个相当大的学习曲线,生成文件是首选的解决方案。在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 [email protected] 
    $(CC) $(CC_FLAGS) $< -o [email protected] $(LIB_DIRs) $(LIB_NMs) 

# pattern rule R02 
# when any ARCHIVE changes, trigger a rebuild 
% : %.cc $(LIB_ARCHIVEs) 
    @echo 
    @echo R02: $< 
    rm -f [email protected] 
    $(CC) $(CC_FLAGS) $< -o [email protected] $(LIB_DIRs) $(LIB_NMs) 

偶尔,我会添加特定的LIB名和目录...直接向LIB_DIRs和LIB_NMs定义在Makefile中。例如,在这里我添加-lrt和-pthread:

LIB_NMs += -lbag_i686 -lposix_i686 -lrt -pthread 

bag_i686和posix_i686是图书馆我建...简单的C++类包装围绕Linux和POSIX功能。我的大部分单元测试都不会使用很多posix的东西,但是我不会感到悲伤。

使用C++ std :: thread,我很少使用-pthread。但是,我偶尔会使用posix信号量。


我的编译的命令行访问(在Ubuntu上的Emacs)提供了一个历史,所以偶尔的改变或添加命令行仅仅是一个“麻烦”一次。从此,新的命令在历史中可用。

我启动emacs的配置有“嵌入式”预先定义的编译命令:

USER_FLAGS='-O0 ' ; export USER_FLAGS ; time make CC='g++ -m64' -j 2 -k 

此命令显示了第一时间我从emacs的内启动编译器。 Emacs提供它就好像该命令已经在'编译命令历史'中。

我手动缩短这一点,如果我不重建所有,平时我只建立一个单一的UT:

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编译中启动)以上一个命令开始,向上/向下箭头通过任何其他版本的命令。


利用这种形式的命令,我可以平凡从克++改变由在适当的位置插入“族”到铛++:

USER_FLAGS='-O0 ' ; export USER_FLAGS ; time make CC='clang++ -m64' 

铛++通常提供额外的诊断使g ++不报告。要回滚到g ++,我可以在编译器命令面板中向上箭头(或编辑命令)。


这是一个小例子,其中我的单元测试代码有多个src文件。通常情况下,非主文件(如eng_format *)是我计划捕捉到我的图书馆之一以备将来使用代码:

FMssb.o : FMssb.cc FMssb.hh 
    @echo 
    @echo R_FMssb.o: $< 
    rm -f [email protected] 
    $(CC) $(CC_FLAGS) -c $< -o [email protected] 

FMssb_ut : FMssb_ut.cc eng_format.o FMssb.o $(LIB_ARCHIVEs) 
    @echo 
    @echo R_FMssb_ut: $< 
    rm -f [email protected] 
    $(CC) $(CC_FLAGS) $< -o [email protected] 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 [email protected] 
    $(CC) $(CC_FLAGS) -c $< -o [email protected] $(LIB_DIRs) $(LIB_NMs)