我遇到这个问题,GCC编译器在连接两个目标文件时似乎失败了。目标文件foo1.cc
和foo2.cc
都包含名为foo1.hh
的头文件中的类。此外,头文件foo.hh
具有foo1.cc
中显示的对象实例的外部声明。
应该注意的是,头文件foo.hh
只会在两个源文件foo1.cc
和foo2.cc
之间定义一次。
当我使用以下命令编译源文件时,一切似乎都有效:
g++ foo1.cc foo2.cc
上述命令将生成一个名为a.out
的可执行文件。
当我尝试将源文件独立编译为目标文件时:
g++ -c foo1.cc
g++ -c foo2.cc
g++ -o foo1.o foo2.o
GCC编译器抱怨foo2.cc
中有对函数的未定义引用。这些功能应在foo1.cc
中定义;但是,链接器无法识别。
我想知道是否有办法解决GCC编译器的这个问题。
答案 0 :(得分:9)
没有问题,你的gcc语法中有错误。
g++ -c foo1.cc
g++ -c foo2.cc
g++ -o foo foo1.o foo2.o
-o
参数接受输出文件的名称,因此在您的情况下,它会用链接结果覆盖foo1.o。
答案 1 :(得分:3)
你的最后一个命令就是链接命令:用foo2.o创建一个可执行文件并命名可执行文件foo1.o.链接器可能找不到创建可执行文件所需的所有信息,因为您打算同时使用foo1.o和foo2.o.只需完全忽略-o
标志:
g++ foo1.o foo2.o