- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试编译一个简单的 hello world 程序:
主要.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
,一切进入t.o
,所以当链接器尝试将目标文件链接在一起,它到处都会遇到多个定义。
尝试静态模式规则:
$(object_files): $(object_dir)/%.o: %.cpp
$(cpp_compiler) $< $(cpp_compiler_flags) $(included_directories) -o $@
编辑:
附言你可能需要帮助 Make 找到 t.cpp
:
vpath %.cpp test
关于c++ - 编译简单的 hello world 程序时错误泛滥,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31329581/
我有一个 Linux 机器,我注意到每当我运行 adb 时,大量垃圾消息就会涌入系统日志,例如: Mar 09 17:22:39 laptoo kernel: hub 1-0:1.0: hub_res
我正在制作一个简单的命令行程序,用于使用 Python 中的 Twill 模块从网站(非常通用)收集和解析信息。我想使用 Twill 的 show() 命令将 HTML 输出分配给一个变量,以通过我的
我最近编写了一个处理大量吞吐量(每天 60+ 百万个请求)的小型服务,但它遇到了内存问题。起初,我查看了所有常见的嫌疑人,确信它必须是我写的东西,而不是与非常有用的、面向性能的 ServiceStac
使用 nvcc(使用 cuda 3.1)编译项目时,我从 gthr-default.h 收到大量警告: /usr/lib/gcc/x86_64-redhat-linux/4.4.4/../../../
我是一名优秀的程序员,十分优秀!