UPDATE: I am including the isolated call to ld as well. And providing a second sample main function that does succcessfully compile, link, and call into std:: methods. Both appear at the end of this edited post. Also, I have tried providing -std=c++11 -stdlib=libc++ compiler options, along with many other attempts to get clang to find/link the correct library. These produce the same undefined symbol errors.
I can't understand why the linker is able to find std::out (in the working example) but not std::ofstream (in the example that fails).
Original problem description:
Compiling on my Mac, I am getting Undefined Symbols when using std::ofstream.
I have re-installed the XCode command line tools and tried every permutation of library paths and switches I could find. I've tried "clang++" and "g++" to compile this code, but continue to get linker Undefined Symbol errors on my Mac (OSX 12.6.3, XCode 14.2 (14C18)).
Any help would be very much appreciated!
Here is my short C++ file, foo.cpp:
#include <fstream>
int main(int argv, char*[])
{
std::ofstream out("out.txt");
out << "This is output written to a file\n";
}
And here is me trying to compile it:
% g++ foo.cpp
Undefined symbols for architecture x86_64:
"std::__1::basic_filebuf<char, std::__1::char_traits<char> >::open(char const*, unsigned int)", referenced from:
std::__1::basic_ofstream<char, std::__1::char_traits<char> >::basic_ofstream(char const*, unsigned int) in foo-d774c2.o
"std::__1::basic_filebuf<char, std::__1::char_traits<char> >::basic_filebuf()", referenced from:
std::__1::basic_ofstream<char, std::__1::char_traits<char> >::basic_ofstream(char const*, unsigned int) in foo-d774c2.o
"std::__1::basic_filebuf<char, std::__1::char_traits<char> >::~basic_filebuf()", referenced from:
std::__1::basic_ofstream<char, std::__1::char_traits<char> >::basic_ofstream(char const*, unsigned int) in foo-d774c2.o
std::__1::basic_ofstream<char, std::__1::char_traits<char> >::~basic_ofstream() in foo-d774c2.o
"VTT for std::__1::basic_ofstream<char, std::__1::char_traits<char> >", referenced from:
std::__1::basic_ofstream<char, std::__1::char_traits<char> >::basic_ofstream(char const*, unsigned int) in foo-d774c2.o
std::__1::basic_ofstream<char, std::__1::char_traits<char> >::~basic_ofstream() in foo-d774c2.o
"vtable for std::__1::basic_ofstream<char, std::__1::char_traits<char> >", referenced from:
std::__1::basic_ofstream<char, std::__1::char_traits<char> >::basic_ofstream(char const*, unsigned int) in foo-d774c2.o
NOTE: a missing vtable usually means the first non-inline virtual member function has no definition.
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)
And here is me trying to compile it with -v to reveal compiler and linker options, search paths, etc:
% g++ -v foo.cpp
Apple clang version 14.0.0 (clang-1400.0.29.202)
Target: x86_64-apple-darwin21.6.0
Thread model: posix
InstalledDir: /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin
"/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/clang" -cc1 -triple x86_64-apple-macosx12.0.0 -Wundef-prefix=TARGET_OS_ -Wdeprecated-objc-isa-usage -Werror=deprecated-objc-isa-usage -Werror=implicit-function-declaration -emit-obj -mrelax-all --mrelax-relocations -disable-free -clear-ast-before-backend -disable-llvm-verifier -discard-value-names -main-file-name foo.cpp -mrelocation-model pic -pic-level 2 -mframe-pointer=all -fno-strict-return -fno-rounding-math -funwind-tables=2 -target-sdk-version=13.1 -fvisibility-inlines-hidden-static-local-var -target-cpu penryn -tune-cpu generic -debugger-tuning=lldb -target-linker-version 820.1 -v -resource-dir /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/lib/clang/14.0.0 -isysroot /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk -I/usr/local/include -stdlib=libc++ -internal-isystem /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk/usr/include/c++/v1 -internal-isystem /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk/usr/local/include -internal-isystem /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/lib/clang/14.0.0/include -internal-externc-isystem /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk/usr/include -internal-externc-isystem /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include -Wno-reorder-init-list -Wno-implicit-int-float-conversion -Wno-c99-designator -Wno-final-dtor-non-final-class -Wno-extra-semi-stmt -Wno-misleading-indentation -Wno-quoted-include-in-framework-header -Wno-implicit-fallthrough -Wno-enum-enum-conversion -Wno-enum-float-conversion -Wno-elaborated-enum-base -Wno-reserved-identifier -Wno-gnu-folding-constant -Wno-cast-function-type -Wno-bitwise-instead-of-logical -fdeprecated-macro -fdebug-compilation-dir=/Users/ghassett/tmp -ferror-limit 19 -stack-protector 1 -fstack-check -mdarwin-stkchk-strong-link -fblocks -fencode-extended-block-signature -fregister-global-dtors-with-atexit -fgnuc-version=4.2.1 -fno-cxx-modules -fcxx-exceptions -fexceptions -fmax-type-align=16 -fcommon -fcolor-diagnostics -clang-vendor-feature=+messageToSelfInClassMethodIdReturnType -clang-vendor-feature=+disableInferNewAvailabilityFromInit -clang-vendor-feature=+disableNonDependentMemberExprInCurrentInstantiation -fno-odr-hash-protocols -clang-vendor-feature=+enableAggressiveVLAFolding -clang-vendor-feature=+revert09abecef7bbf -clang-vendor-feature=+thisNoAlignAttr -clang-vendor-feature=+thisNoNullAttr -mllvm -disable-aligned-alloc-awareness=1 -D__GCC_HAVE_DWARF2_CFI_ASM=1 -o /var/folders/gp/4g1pmgt925gbj7mrwgsjlxbc0000gn/T/foo-55ecc8.o -x c++ foo.cpp
clang -cc1 version 14.0.0 (clang-1400.0.29.202) default target x86_64-apple-darwin21.6.0
ignoring nonexistent directory "/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk/usr/local/include"
ignoring nonexistent directory "/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk/Library/Frameworks"
#include "..." search starts here:
#include <...> search starts here:
/usr/local/include
/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk/usr/include/c++/v1
/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/lib/clang/14.0.0/include
/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk/usr/include
/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include
/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk/System/Library/Frameworks (framework directory)
End of search list.
"/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/ld" -demangle -lto_library /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/lib/libLTO.dylib -no_deduplicate -dynamic -arch x86_64 -platform_version macos 12.0.0 13.1 -syslibroot /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk -o a.out -L/usr/local/lib /var/folders/gp/4g1pmgt925gbj7mrwgsjlxbc0000gn/T/foo-55ecc8.o -lc++ -lSystem /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/lib/clang/14.0.0/lib/darwin/libclang_rt.osx.a
Undefined symbols for architecture x86_64:
"std::__1::basic_filebuf<char, std::__1::char_traits<char> >::open(char const*, unsigned int)", referenced from:
std::__1::basic_ofstream<char, std::__1::char_traits<char> >::basic_ofstream(char const*, unsigned int) in foo-55ecc8.o
"std::__1::basic_filebuf<char, std::__1::char_traits<char> >::basic_filebuf()", referenced from:
std::__1::basic_ofstream<char, std::__1::char_traits<char> >::basic_ofstream(char const*, unsigned int) in foo-55ecc8.o
"std::__1::basic_filebuf<char, std::__1::char_traits<char> >::~basic_filebuf()", referenced from:
std::__1::basic_ofstream<char, std::__1::char_traits<char> >::basic_ofstream(char const*, unsigned int) in foo-55ecc8.o
std::__1::basic_ofstream<char, std::__1::char_traits<char> >::~basic_ofstream() in foo-55ecc8.o
"VTT for std::__1::basic_ofstream<char, std::__1::char_traits<char> >", referenced from:
std::__1::basic_ofstream<char, std::__1::char_traits<char> >::basic_ofstream(char const*, unsigned int) in foo-55ecc8.o
std::__1::basic_ofstream<char, std::__1::char_traits<char> >::~basic_ofstream() in foo-55ecc8.o
"vtable for std::__1::basic_ofstream<char, std::__1::char_traits<char> >", referenced from:
std::__1::basic_ofstream<char, std::__1::char_traits<char> >::basic_ofstream(char const*, unsigned int) in foo-55ecc8.o
NOTE: a missing vtable usually means the first non-inline virtual member function has no definition.
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)
Isolated linker command:
The isolated call to ld looks like this -- note that -lc++ is provided to the linker:
/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/ld \
-demangle \
-lto_library /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/lib/libLTO.dylib \
-no_deduplicate \
-dynamic \
-arch x86_64 \
-platform_version macos 12.0.0 13.1 \
-syslibroot /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk \
-o a.out \
-L/usr/local/lib \
foo.o \
-lc++ \
-lSystem /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/lib/clang/14.0.0/lib/darwin/libclang_rt.osx.a
The output is the same:
Undefined symbols for architecture x86_64:
"std::__1::basic_filebuf<char, std::__1::char_traits<char> >::open(char const*, unsigned int)", referenced from:
std::__1::basic_ofstream<char, std::__1::char_traits<char> >::basic_ofstream(char const*, unsigned int) in foo.o
"std::__1::basic_filebuf<char, std::__1::char_traits<char> >::basic_filebuf()", referenced from:
std::__1::basic_ofstream<char, std::__1::char_traits<char> >::basic_ofstream(char const*, unsigned int) in foo.o
"std::__1::basic_filebuf<char, std::__1::char_traits<char> >::~basic_filebuf()", referenced from:
std::__1::basic_ofstream<char, std::__1::char_traits<char> >::basic_ofstream(char const*, unsigned int) in foo.o
std::__1::basic_ofstream<char, std::__1::char_traits<char> >::~basic_ofstream() in foo.o
"VTT for std::__1::basic_ofstream<char, std::__1::char_traits<char> >", referenced from:
std::__1::basic_ofstream<char, std::__1::char_traits<char> >::basic_ofstream(char const*, unsigned int) in foo.o
std::__1::basic_ofstream<char, std::__1::char_traits<char> >::~basic_ofstream() in foo.o
"vtable for std::__1::basic_ofstream<char, std::__1::char_traits<char> >", referenced from:
std::__1::basic_ofstream<char, std::__1::char_traits<char> >::basic_ofstream(char const*, unsigned int) in foo.o
NOTE: a missing vtable usually means the first non-inline virtual member function has no definition.
ld: symbol(s) not found for architecture x86_64
Example that successfully links and uses std:
This code compiles, links, and executes:
% cat works.cpp
#include <iostream>
int main(int argv, char*[])
{
std::cout << "Writing to the console works\n";
}
% g++ works.cpp -o works
% ./works
Writing to the console works
Thanks so much for any help you might be able to provide!
UPDATE: There had to have been a conflict between some developer tools installed via homebrew and the XCode command line tools. Some combination of
brew update,brew upgrade,brew doctor, andbrew unlink llvmhas done the trick and my little application now compiles and links. Thanks to everyone who helped out. I realize that my answer here is imperfect but hopefully it will still be of help to someone down the line.