繁体   English   中英

编译简单的hello world程序时发生错误

[英]Error-flood when compiling simple hello world program

我正在尝试编译一个简单的hello world程序:

main.cpp

#include <iostream>
#include <test/t.hpp>

int main( int argc , char** args )
{
    std::cout << test() << std::endl;
    int x;
    std::cin >> x;
    return 0;
}

测试/t.hpp

#ifndef TEST_T_HPP_INCLUDED
#define TEST_T_HPP_INCLUDED

int test();

#endif // TEST_T_HPP_INCLUDED

测试/t.cpp

#include <test/t.hpp>

int test()
{
    return 42;
}

使用此makefile:

executable_name = testapp
cpp_compiler = g++
cpp_compiler_flags += -std=c++14
cpp_compiler_flags += -g
cpp_linker_flags += -g
linked_libraries +=
included_directories += -I./src/
source_dir = src
source_files += main.cpp
source_files += test/t.cpp
object_dir = obj
object_files = $(addprefix $(object_dir)/,$(source_files:=.o))
directories = $(sort $(foreach i,$(object_files),$(dir $i)))
source_files := $(addprefix $(source_dir)/,$(source_files))

all: make_directories tool

tool: $(object_files)
    $(cpp_compiler) $(cpp_linker_flags) -o $(executable_name) $(object_files) $(linked_libraries)

$(object_files): $(source_files)
    $(cpp_compiler) $^ $(cpp_compiler_flags) $(included_directories) -o $@

make_directories:
    @sh -c \
        'for d in $(directories); do \
            if [ ! -d $$d ]; \
                then echo mkdir -p $$d; mkdir -p $$d; \
            fi \
        done'

通过使用CodeBlocks 13.12(和mingw32-make)随附的TDM-GCC-4.8.1工具

但是我收到超过10000个错误,如下所示:

obj/src/main.cpp.o:crtend.c:(.text+0x26a80): first defined here
obj/src/test/t.cpp.o:crtend.c:(.text+0x26880): multiple definition of `std::__us
e_cache<std::__numpunct_cache<char> >::operator()(std::locale const&) const'
obj/src/main.cpp.o:crtend.c:(.text+0x26880): first defined here
obj/src/test/t.cpp.o:crtend.c:(.text+0x350d0): multiple definition of `std::ostr
eambuf_iterator<char, std::char_traits<char> > std::num_put<char, std::ostreambu
f_iterator<char, std::char_traits<char> > >::_M_insert_float<double>(std::ostrea
mbuf_iterator<char, std::char_traits<char> >, std::ios_base&, char, char, double
) const'
obj/src/main.cpp.o:crtend.c:(.text+0x350d0): first defined here
obj/src/test/t.cpp.o:crtend.c:(.text+0x35ee0): multiple definition of `std::num_
put<char, std::ostreambuf_iterator<char, std::char_traits<char> > >::do_put(std:
:ostreambuf_iterator<char, std::char_traits<char> >, std::ios_base&, char, doubl
e) const'
obj/src/main.cpp.o:crtend.c:(.text+0x35ee0): first defined here

我猜这是链接器错误,正如我可以瞬间看到要编译的源文件。

我在这里想念什么?


编辑

这条规则使它起作用:

$(object_files): $(object_dir)/%.o : $(source_dir)/%
    $(cpp_compiler) -c $^ $(cpp_compiler_flags) $(included_directories) -o $@

问题在这里:

$(object_files): $(source_files)
    $(cpp_compiler) $^ $(cpp_compiler_flags) $(included_directories) -o $@

此配方使所有源文件成为每个目标文件的先决条件。 因此,当Make尝试构建main.o ,它将执行

g++ ... main.cpp test/t.cpp -o main.o

一切都进入main.o一切都进入to ,所以当连接器试图将目标文件链接在一起,它无处不在,击中多个定义。

尝试使用静态模式规则:

$(object_files): $(object_dir)/%.o: %.cpp
    $(cpp_compiler) $< $(cpp_compiler_flags) $(included_directories) -o $@

编辑:

PS,您可能需要帮助来找到t.cpp

vpath %.cpp test

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM