【发布时间】:2021-02-19 02:52:00
【问题描述】:
尝试使用PMAKE(默认的FreeBSD make)编译我的第一个c++程序。
helloworld.cpp:
#include <iostream>
int main() {
std::cout << "Hello World!" << std::endl;
std::cin.get();
}
makefile:
OBJS = helloworld.o
CFLAGS = -Wall -Werror -std=c++14
helloworld : $(OBJS)
cc $(.ALLSRC) -o $(.TARGET)
helloworld.o : helloworld.cpp
cc -c helloworld.cpp
输出
$make
cc helloworld.o -o helloworld
ld: error: undefined symbol: std::__1::cout
>>> referenced by helloworld.cpp
>>> helloworld.o:(main)
ld: error: undefined symbol: std::__1::cin
>>> referenced by helloworld.cpp
>>> helloworld.o:(main)
ld: error: undefined symbol: std::__1::basic_istream<char, std::__1::char_traits<char> >::get()
>>> referenced by helloworld.cpp
>>> helloworld.o:(main)
ld: error: undefined symbol: std::__1::basic_ostream<char, std::__1::char_traits<char> >::put(char)
>>> referenced by helloworld.cpp
>>> helloworld.o:(std::__1::basic_ostream<char, std::__1::char_traits<char> >& std::__1::endl<char, std::__1::char_traits<char> >(std::__1::basic_ostream<char, std::__1::char_traits<char> >&))
ld: error: undefined symbol: std::__1::basic_ostream<char, std::__1::char_traits<char> >::flush()
>>> referenced by helloworld.cpp
>>> helloworld.o:(std::__1::basic_ostream<char, std::__1::char_traits<char> >& std::__1::endl<char, std::__1::char_traits<char> >(std::__1::basic_ostream<char, std::__1::char_traits<char> >&))
ld: error: undefined symbol: std::__1::basic_ostream<char, std::__1::char_traits<char> >::sentry::sentry(std::__1::basic_ostream<char, std::__1::char_traits<char> >&)
>>> referenced by helloworld.cpp
>>> helloworld.o:(std::__1::basic_ostream<char, std::__1::char_traits<char> >& std::__1::__put_character_sequence<char, std::__1::char_traits<char> >(std::__1::basic_ostream<char, std::__1::char_traits<char> >&, char const*, unsigned long))
ld: error: undefined symbol: std::__1::basic_ostream<char, std::__1::char_traits<char> >::sentry::~sentry()
>>> referenced by helloworld.cpp
>>> helloworld.o:(std::__1::basic_ostream<char, std::__1::char_traits<char> >& std::__1::__put_character_sequence<char, std::__1::char_traits<char> >(std::__1::basic_ostream<char, std::__1::char_traits<char> >&, char const*, unsigned long))
>>> referenced by helloworld.cpp
>>> helloworld.o:(std::__1::basic_ostream<char, std::__1::char_traits<char> >& std::__1::__put_character_sequence<char, std::__1::char_traits<char> >(std::__1::basic_ostream<char, std::__1::char_traits<char> >&, char const*, unsigned long))
ld: error: undefined symbol: __cxa_begin_catch
>>> referenced by helloworld.cpp
>>> helloworld.o:(std::__1::basic_ostream<char, std::__1::char_traits<char> >& std::__1::__put_character_sequence<char, std::__1::char_traits<char> >(std::__1::basic_ostream<char, std::__1::char_traits<char> >&, char const*, unsigned long))
>>> referenced by helloworld.cpp
>>> helloworld.o:(__clang_call_terminate)
ld: error: undefined symbol: std::__1::ios_base::__set_badbit_and_consider_rethrow()
>>> referenced by helloworld.cpp
>>> helloworld.o:(std::__1::basic_ostream<char, std::__1::char_traits<char> >& std::__1::__put_character_sequence<char, std::__1::char_traits<char> >(std::__1::basic_ostream<char, std::__1::char_traits<char> >&, char const*, unsigned long))
ld: error: undefined symbol: __cxa_end_catch
>>> referenced by helloworld.cpp
>>> helloworld.o:(std::__1::basic_ostream<char, std::__1::char_traits<char> >& std::__1::__put_character_sequence<char, std::__1::char_traits<char> >(std::__1::basic_ostream<char, std::__1::char_traits<char> >&, char const*, unsigned long))
>>> referenced by helloworld.cpp
>>> helloworld.o:(std::__1::basic_ostream<char, std::__1::char_traits<char> >& std::__1::__put_character_sequence<char, std::__1::char_traits<char> >(std::__1::basic_ostream<char, std::__1::char_traits<char> >&, char const*, unsigned long))
ld: error: undefined symbol: std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >::~basic_string()
>>> referenced by helloworld.cpp
>>> helloworld.o:(std::__1::ostreambuf_iterator<char, std::__1::char_traits<char> > std::__1::__pad_and_output<char, std::__1::char_traits<char> >(std::__1::ostreambuf_iterator<char, std::__1::char_traits<char> >, char const*, char const*, char const*, std::__1::ios_base&, char))
>>> referenced by helloworld.cpp
>>> helloworld.o:(std::__1::ostreambuf_iterator<char, std::__1::char_traits<char> > std::__1::__pad_and_output<char, std::__1::char_traits<char> >(std::__1::ostreambuf_iterator<char, std::__1::char_traits<char> >, char const*, char const*, char const*, std::__1::ios_base&, char))
ld: error: undefined symbol: std::terminate()
>>> referenced by helloworld.cpp
>>> helloworld.o:(__clang_call_terminate)
ld: error: undefined symbol: std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >::__init(unsigned long, char)
>>> referenced by helloworld.cpp
ld: error: undefined symbol: std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >::__init(unsigned long, char)
>>> referenced by helloworld.cpp
>>> helloworld.o:(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >::basic_string(unsigned long, char))
ld: error: undefined symbol: std::__1::ios_base::getloc() const
>>> referenced by helloworld.cpp
>>> helloworld.o:(std::__1::basic_ios<char, std::__1::char_traits<char> >::widen(char) const)
ld: error: undefined symbol: std::__1::locale::~locale()
>>> referenced by helloworld.cpp
>>> helloworld.o:(std::__1::basic_ios<char, std::__1::char_traits<char> >::widen(char) const)
>>> referenced by helloworld.cpp
>>> helloworld.o:(std::__1::basic_ios<char, std::__1::char_traits<char> >::widen(char) const)
ld: error: undefined symbol: std::__1::ctype<char>::id
>>> referenced by helloworld.cpp
>>> helloworld.o:(std::__1::ctype<char> const& std::__1::use_facet<std::__1::ctype<char> >(std::__1::locale const&))
ld: error: undefined symbol: std::__1::locale::use_facet(std::__1::locale::id&) const
>>> referenced by helloworld.cpp
>>> helloworld.o:(std::__1::ctype<char> const& std::__1::use_facet<std::__1::ctype<char> >(std::__1::locale const&))
ld: error: undefined symbol: std::__1::ios_base::clear(unsigned int)
>>> referenced by helloworld.cpp
>>> helloworld.o:(std::__1::ios_base::setstate(unsigned int))
ld: error: undefined symbol: __gxx_personality_v0
>>> referenced by helloworld.cpp
>>> helloworld.o:(.eh_frame+0x4AB)
cc: error: linker command failed with exit code 1 (use -v to see invocation
我使用的是FreeBSD 12.2,默认为clang 10.0.1。
注意:cc -o helloworld helloworld.cpp 也不起作用。
这个问题可能很基础,但我还是卡住了。
【问题讨论】:
-
尝试改用
c++(或clang++)。它将自动与 C++ 标准库链接。 -
通过这样做(使用
c++),它可以工作。这就是预期使用makefile的方式吗?我的意思是使用c++而不是cc?我还可以在 makefile 中手动链接 C++ 标准库吗? (更好地理解链接过程) -
如果你编译C++代码你应该使用
c++命令,如果你编译C代码你应该使用cc命令。然后,要链接,如果您的任何源文件使用 C++,请使用c++,如果都是 C,请使用cc。
标签: c++ makefile clang freebsd