How to tell cmake to link libcxx correctly?
Background
llvm, clang, libcxx/libcxxabi are built from source by me. they are located at usr/local
.
Minimum source file
//findpath.cpp
#include <iostream>
int main(){
std::cout << "Hi";
}
CMakeLists.txt
cmake_minimum_required(VERSION 3.6)
set(CMAKE_CXX_COMPILER "clang++")
set(CMAKE_C_COMPILER "clang")
project(FindPath)
add_compile_options("-stdlib=libc++" "-lc++abi" "-v")
add_executable(path findpath.cpp)
With cmake(output linker error)
~/.../findpath/build >>> cmake -DCMAKE_EXPORT_COMPILE_COMMANDS=1 .. ±[●][master]
-- The C compiler identification is Clang 8.0.0
-- The CXX compiler identification is Clang 8.0.0
-- Check for working C compiler: /usr/local/bin/clang
-- Check for working C compiler: /usr/local/bin/clang -- works
-- Detecting C compiler ABI info
-- Detecting C compiler ABI info - done
-- Detecting C compile features
-- Detecting C compile features - done
-- Check for working CXX compiler: /usr/local/bin/clang++
-- Check for working CXX compiler: /usr/local/bin/clang++ -- works
-- Detecting CXX compiler ABI info
-- Detecting CXX compiler ABI info - done
-- Detecting CXX compile features
-- Detecting CXX compile features - done
-- Configuring done
-- Generating done
-- Build files have been written to: /home/firstlove/projects/smalltools/findpath/build
~/.../findpath/build >>> make ±[●][master]
Scanning dependencies of target path
[ 50%] Building CXX object CMakeFiles/path.dir/findpath.cpp.o
clang version 8.0.0 (http://llvm.org/git/clang 55ead9f6f66545bcfda4a0f7e6dd3748a296f826) (https://github.com/llvm-mirror/llvm.git 8d97f0d4be38ebd4b38fe2cff51e0713b3dfba66)
Target: x86_64-unknown-linux-gnu
Thread model: posix
InstalledDir: /usr/local/bin
Found candidate GCC installation: /usr/lib/gcc/x86_64-pc-linux-gnu/8.1.1
Found candidate GCC installation: /usr/lib64/gcc/x86_64-pc-linux-gnu/8.1.1
Selected GCC installation: /usr/lib64/gcc/x86_64-pc-linux-gnu/8.1.1
Candidate multilib: .;@m64
Candidate multilib: 32;@m32
Selected multilib: .;@m64
clang-8: warning: -lc++abi: 'linker' input unused [-Wunused-command-line-argument]
"/usr/local/bin/clang-8" -cc1 -triple x86_64-unknown-linux-gnu -emit-obj -mrelax-all -disable-free -disable-llvm-verifier -discard-value-names -main-file-name findpath.cpp -mr
elocation-model static -mthread-model posix -mdisable-fp-elim -fmath-errno -masm-verbose -mconstructor-aliases -munwind-tables -fuse-init-array -target-cpu x86-64 -dwarf-column
-info -debugger-tuning=gdb -v -coverage-notes-file /home/firstlove/projects/smalltools/findpath/build/CMakeFiles/path.dir/findpath.cpp.gcno -resource-dir /usr/local/lib/clang/8
.0.0 -internal-isystem /usr/local/bin/../include/c++/v1 -internal-isystem /usr/local/include -internal-isystem /usr/local/lib/clang/8.0.0/include -internal-externc-isystem /inc
lude -internal-externc-isystem /usr/include -fdeprecated-macro -fdebug-compilation-dir /home/firstlove/projects/smalltools/findpath/build -ferror-limit 19 -fmessage-length 176
-fobjc-runtime=gcc -fcxx-exceptions -fexceptions -fdiagnostics-show-option -fcolor-diagnostics -o CMakeFiles/path.dir/findpath.cpp.o -x c++ /home/firstlove/projects/smalltools/
findpath/findpath.cpp -faddrsig
clang -cc1 version 8.0.0 based upon LLVM 8.0.0svn default target x86_64-unknown-linux-gnu
ignoring nonexistent directory "/include"
#include "..." search starts here:
#include <...> search starts here:
/usr/local/bin/../include/c++/v1
/usr/local/include
/usr/local/lib/clang/8.0.0/include
/usr/include
End of search list.
[100%] Linking CXX executable path
CMakeFiles/path.dir/findpath.cpp.o: In function `main':
findpath.cpp:(.text+0xa): undefined reference to `std::__1::cout'
CMakeFiles/path.dir/findpath.cpp.o: In function `std::__1::basic_ostream<char, std::__1::char_traits<char> >& std::__1::__put_character_sequence<char, std::__1::char_traits<cha
r> >(std::__1::basic_ostream<char, std::__1::char_traits<char> >&, char const*, unsigned long)':
findpath.cpp:(.text._ZNSt3__124__put_character_sequenceIcNS_11char_traitsIcEEEERNS_13basic_ostreamIT_T0_EES7_PKS4_m[_ZNSt3__124__put_character_sequenceIcNS_11char_traitsIcEEEER
NS_13basic_ostreamIT_T0_EES7_PKS4_m]+0x2f): undefined reference to `std::__1::basic_ostream<char, std::__1::char_traits<char> >::sentry::sentry(std::__1::basic_ostream<char, st
d::__1::char_traits<char> >&)'
findpath.cpp:(.text._ZNSt3__124__put_character_sequenceIcNS_11char_traitsIcEEEERNS_13basic_ostreamIT_T0_EES7_PKS4_m[_ZNSt3__124__put_character_sequenceIcNS_11char_traitsIcEEEER
NS_13basic_ostreamIT_T0_EES7_PKS4_m]+0x1be): undefined reference to `std::__1::ios_base::getloc() const'
findpath.cpp:(.text._ZNSt3__124__put_character_sequenceIcNS_11char_traitsIcEEEERNS_13basic_ostreamIT_T0_EES7_PKS4_m[_ZNSt3__124__put_character_sequenceIcNS_11char_traitsIcEEEER
NS_13basic_ostreamIT_T0_EES7_PKS4_m]+0x1d4): undefined reference to `std::__1::ctype<char>::id'
findpath.cpp:(.text._ZNSt3__124__put_character_sequenceIcNS_11char_traitsIcEEEERNS_13basic_ostreamIT_T0_EES7_PKS4_m[_ZNSt3__124__put_character_sequenceIcNS_11char_traitsIcEEEER
NS_13basic_ostreamIT_T0_EES7_PKS4_m]+0x1d9): undefined reference to `std::__1::locale::use_facet(std::__1::locale::id&) const'
findpath.cpp:(.text._ZNSt3__124__put_character_sequenceIcNS_11char_traitsIcEEEERNS_13basic_ostreamIT_T0_EES7_PKS4_m[_ZNSt3__124__put_character_sequenceIcNS_11char_traitsIcEEEER
NS_13basic_ostreamIT_T0_EES7_PKS4_m]+0x235): undefined reference to `std::__1::locale::~locale()'
findpath.cpp:(.text._ZNSt3__124__put_character_sequenceIcNS_11char_traitsIcEEEERNS_13basic_ostreamIT_T0_EES7_PKS4_m[_ZNSt3__124__put_character_sequenceIcNS_11char_traitsIcEEEER
NS_13basic_ostreamIT_T0_EES7_PKS4_m]+0x257): undefined reference to `std::__1::locale::~locale()'
findpath.cpp:(.text._ZNSt3__124__put_character_sequenceIcNS_11char_traitsIcEEEERNS_13basic_ostreamIT_T0_EES7_PKS4_m[_ZNSt3__124__put_character_sequenceIcNS_11char_traitsIcEEEER
NS_13basic_ostreamIT_T0_EES7_PKS4_m]+0x327): undefined reference to `std::__1::ios_base::clear(unsigned int)'
findpath.cpp:(.text._ZNSt3__124__put_character_sequenceIcNS_11char_traitsIcEEEERNS_13basic_ostreamIT_T0_EES7_PKS4_m[_ZNSt3__124__put_character_sequenceIcNS_11char_traitsIcEEEER
NS_13basic_ostreamIT_T0_EES7_PKS4_m]+0x384): undefined reference to `std::__1::basic_ostream<char, std::__1::char_traits<char> >::sentry::~sentry()'
findpath.cpp:(.text._ZNSt3__124__put_character_sequenceIcNS_11char_traitsIcEEEERNS_13basic_ostreamIT_T0_EES7_PKS4_m[_ZNSt3__124__put_character_sequenceIcNS_11char_traitsIcEEEER
NS_13basic_ostreamIT_T0_EES7_PKS4_m]+0x3ad): undefined reference to `std::__1::ios_base::__set_badbit_and_consider_rethrow()'
findpath.cpp:(.text._ZNSt3__124__put_character_sequenceIcNS_11char_traitsIcEEEERNS_13basic_ostreamIT_T0_EES7_PKS4_m[_ZNSt3__124__put_character_sequenceIcNS_11char_traitsIcEEEER
NS_13basic_ostreamIT_T0_EES7_PKS4_m]+0x3d8): undefined reference to `std::__1::basic_ostream<char, std::__1::char_traits<char> >::sentry::~sentry()'
CMakeFiles/path.dir/findpath.cpp.o: In function `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)':
findpath.cpp:(.text._ZNSt3__116__pad_and_outputIcNS_11char_traitsIcEEEENS_19ostreambuf_iteratorIT_T0_EES6_PKS4_S8_S8_RNS_8ios_baseES4_[_ZNSt3__116__pad_and_outputIcNS_11char_tr
aitsIcEEEENS_19ostreambuf_iteratorIT_T0_EES6_PKS4_S8_S8_RNS_8ios_baseES4_]+0x219): undefined reference to `std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::a
llocator<char> >::__init(unsigned long, char)'
findpath.cpp:(.text._ZNSt3__116__pad_and_outputIcNS_11char_traitsIcEEEENS_19ostreambuf_iteratorIT_T0_EES6_PKS4_S8_S8_RNS_8ios_baseES4_[_ZNSt3__116__pad_and_outputIcNS_11char_tr
aitsIcEEEENS_19ostreambuf_iteratorIT_T0_EES6_PKS4_S8_S8_RNS_8ios_baseES4_]+0x388): undefined reference to `std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::a
llocator<char> >::~basic_string()'
findpath.cpp:(.text._ZNSt3__116__pad_and_outputIcNS_11char_traitsIcEEEENS_19ostreambuf_iteratorIT_T0_EES6_PKS4_S8_S8_RNS_8ios_baseES4_[_ZNSt3__116__pad_and_outputIcNS_11char_tr
aitsIcEEEENS_19ostreambuf_iteratorIT_T0_EES6_PKS4_S8_S8_RNS_8ios_baseES4_]+0x3a3): undefined reference to `std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::a
llocator<char> >::~basic_string()'
clang-8: error: linker command failed with exit code 1 (use -v to see invocation)
make[2]: *** [CMakeFiles/path.dir/build.make:84: path] Error 1
make[1]: *** [CMakeFiles/Makefile2:73: CMakeFiles/path.dir/all] Error 2
make: *** [Makefile:84: all] Error 2
clang++ -stdlib=libc++ -lc++abi -std=c++17 -v findpath.cpp
Without cmake(no link error): ~/.../smalltools/findpath >>> clang++ -stdlib=libc++ -lc++abi -std=c++17 -v findpath.cpp ±[●][master]
clang version 8.0.0 (http://llvm.org/git/clang 55ead9f6f66545bcfda4a0f7e6dd3748a296f826) (https://github.com/llvm-mirror/llvm.git 8d97f0d4be38ebd4b38fe2cff51e0713b3dfba66)
Target: x86_64-unknown-linux-gnu
Thread model: posix
InstalledDir: /usr/local/bin
Found candidate GCC installation: /usr/lib/gcc/x86_64-pc-linux-gnu/8.1.1
Found candidate GCC installation: /usr/lib64/gcc/x86_64-pc-linux-gnu/8.1.1
Selected GCC installation: /usr/lib64/gcc/x86_64-pc-linux-gnu/8.1.1
Candidate multilib: .;@m64
Candidate multilib: 32;@m32
Selected multilib: .;@m64
"/usr/local/bin/clang-8" -cc1 -triple x86_64-unknown-linux-gnu -emit-obj -mrelax-all -disable-free -disable-llvm-verifier -discard-value-names -main-file-name findpath.cpp -mr
elocation-model static -mthread-model posix -mdisable-fp-elim -fmath-errno -masm-verbose -mconstructor-aliases -munwind-tables -fuse-init-array -target-cpu x86-64 -dwarf-column
-info -debugger-tuning=gdb -v -resource-dir /usr/local/lib/clang/8.0.0 -internal-isystem /usr/local/bin/../include/c++/v1 -internal-isystem /usr/local/include -internal-isystem
/usr/local/lib/clang/8.0.0/include -internal-externc-isystem /include -internal-externc-isystem /usr/include -std=c++17 -fdeprecated-macro -fdebug-compilation-dir /home/firstl
ove/projects/smalltools/findpath -ferror-limit 19 -fmessage-length 176 -fobjc-runtime=gcc -fcxx-exceptions -fexceptions -fdiagnostics-show-option -fcolor-diagnostics -o /tmp/fi
ndpath-7dd1ae.o -x c++ findpath.cpp -faddrsig
clang -cc1 version 8.0.0 based upon LLVM 8.0.0svn default target x86_64-unknown-linux-gnu
ignoring nonexistent directory "/include"
#include "..." search starts here:
#include <...> search starts here:
/usr/local/bin/../include/c++/v1
/usr/local/include
/usr/local/lib/clang/8.0.0/include
/usr/include
End of search list.
"/usr/bin/ld" --eh-frame-hdr -m elf_x86_64 -dynamic-linker /lib64/ld-linux-x86-64.so.2 -o a.out /usr/lib64/gcc/x86_64-pc-linux-gnu/8.1.1/../../../../lib64/crt1.o /usr/lib64/gc
c/x86_64-pc-linux-gnu/8.1.1/../../../../lib64/crti.o /usr/lib64/gcc/x86_64-pc-linux-gnu/8.1.1/crtbegin.o -L/usr/lib64/gcc/x86_64-pc-linux-gnu/8.1.1 -L/usr/lib64/gcc/x86_64-pc-l
inux-gnu/8.1.1/../../../../lib64 -L/lib/../lib64 -L/usr/lib/../lib64 -L/usr/lib64/gcc/x86_64-pc-linux-gnu/8.1.1/../../.. -L/usr/local/bin/../lib -L/lib -L/usr/lib -lc++abi /tmp
/findpath-7dd1ae.o -lc++ -lm -lgcc_s -lgcc -lc -lgcc_s -lgcc /usr/lib64/gcc/x86_64-pc-linux-gnu/8.1.1/crtend.o /usr/lib64/gcc/x86_64-pc-linux-gnu/8.1.1/../../../../lib64/crtn.o
But from /usr/bin/ld
, it seems use gcc to link?
I have google much, but nothing useful found. If any more information needed, please tell me, thanks in advance.
Update
-
I also tried
set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -stdlib=libc++ -lc++abi")
, but still popup the same linker error. -
To verify whether the problem arises from the source built llvm, clang, libcxx, libcxxabi, I reinstaled os and installed from pacman, unfortunatelly, nothing changed.
-
use VERBOSE=1 make: https://paste.ubuntu.com/p/t5yycfdmsc/
Except for telling me the linker is gnu's ld, other error messages are the same.
Then I give llvm's lld a try,
set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -fuse-ld=lld -stdlib=libc++ -lc++abi")
/usr/bin/cmake -H/home/firstlove/projects/smallProjects/smalltools/findpath -B/home/firstlove/projects/smallProjects/smalltools/findpath/build --check-build-system CMakeFiles/M
akefile.cmake 0
/usr/bin/cmake -E cmake_progress_start /home/firstlove/projects/smallProjects/smalltools/findpath/build/CMakeFiles /home/firstlove/projects/smallProjects/smalltools/findpath/bu
ild/CMakeFiles/progress.marks
make -f CMakeFiles/Makefile2 all
make[1]: Entering directory '/home/firstlove/projects/smallProjects/smalltools/findpath/build'
make -f CMakeFiles/path.dir/build.make CMakeFiles/path.dir/depend
make[2]: Entering directory '/home/firstlove/projects/smallProjects/smalltools/findpath/build'
cd /home/firstlove/projects/smallProjects/smalltools/findpath/build && /usr/bin/cmake -E cmake_depends "Unix Makefiles" /home/firstlove/projects/smallProjects/smalltools/findpa
th /home/firstlove/projects/smallProjects/smalltools/findpath /home/firstlove/projects/smallProjects/smalltools/findpath/build /home/firstlove/projects/smallProjects/smalltools
/findpath/build /home/firstlove/projects/smallProjects/smalltools/findpath/build/CMakeFiles/path.dir/DependInfo.cmake --color=
make[2]: Leaving directory '/home/firstlove/projects/smallProjects/smalltools/findpath/build'
make -f CMakeFiles/path.dir/build.make CMakeFiles/path.dir/build
make[2]: Entering directory '/home/firstlove/projects/smallProjects/smalltools/findpath/build'
[ 50%] Linking CXX executable path
/usr/bin/cmake -E cmake_link_script CMakeFiles/path.dir/link.txt --verbose=1
clang++ -fuse-ld=lld -stdlib=libc++ -lc++abi CMakeFiles/path.dir/findpath.cpp.o -o path
/usr/bin/ld.lld: error: undefined symbol: std::cout
>>> referenced by findpath.cpp
>>> CMakeFiles/path.dir/findpath.cpp.o:(main)
/usr/bin/ld.lld: error: undefined symbol: std::basic_ostream<char, std::char_traits<char> >& std::operator<<<std::char_traits<char> >(std::basic_ostream<char, std::char_traits<
char> >&, char const*)
>>> referenced by findpath.cpp
>>> CMakeFiles/path.dir/findpath.cpp.o:(main)
/usr/bin/ld.lld: error: undefined symbol: std::ios_base::Init::Init()
>>> referenced by findpath.cpp
>>> CMakeFiles/path.dir/findpath.cpp.o:(__cxx_global_var_init)
/usr/bin/ld.lld: error: undefined symbol: std::ios_base::Init::~Init()
>>> referenced by findpath.cpp
>>> CMakeFiles/path.dir/findpath.cpp.o:(__cxx_global_var_init)
clang-6.0: error: linker command failed with exit code 1 (use -v to see invocation)
make[2]: *** [CMakeFiles/path.dir/build.make:84: path] Error 1
make[2]: Leaving directory '/home/firstlove/projects/smallProjects/smalltools/findpath/build'
make[1]: *** [CMakeFiles/Makefile2:68: CMakeFiles/path.dir/all] Error 2
make[1]: Leaving directory '/home/firstlove/projects/smallProjects/smalltools/findpath/build'
make: *** [Makefile:84: all] Error 2
Oops, similar linker error...
Again, without cmake, it works fine:
~/.../smalltools/findpath >>> clang++ -stdlib=libc++ -lc++abi -std=c++17 -v -fuse-ld=lld findpath.cpp ±[A1●][master]
clang version 6.0.1 (tags/RELEASE_601/final)
Target: x86_64-pc-linux-gnu
Thread model: posix
InstalledDir: /usr/bin
Found candidate GCC installation: /usr/bin/../lib/gcc/x86_64-pc-linux-gnu/8.2.0
Found candidate GCC installation: /usr/bin/../lib64/gcc/x86_64-pc-linux-gnu/8.2.0
Found candidate GCC installation: /usr/lib/gcc/x86_64-pc-linux-gnu/8.2.0
Found candidate GCC installation: /usr/lib64/gcc/x86_64-pc-linux-gnu/8.2.0
Selected GCC installation: /usr/bin/../lib64/gcc/x86_64-pc-linux-gnu/8.2.0
Candidate multilib: .;@m64
Candidate multilib: 32;@m32
Selected multilib: .;@m64
"/usr/bin/clang-6.0" -cc1 -triple x86_64-pc-linux-gnu -emit-obj -mrelax-all -disable-free -disable-llvm-verifier -discard-value-names -main-file-name findpath.cpp -mrelocation
-model pic -pic-level 2 -pic-is-pie -mthread-model posix -mdisable-fp-elim -fmath-errno -masm-verbose -mconstructor-aliases -munwind-tables -fuse-init-array -target-cpu x86-64
-dwarf-column-info -debugger-tuning=gdb -v -resource-dir /usr/lib/clang/6.0.1 -internal-isystem /usr/bin/../include/c++/v1 -internal-isystem /usr/local/include -internal-isyste
m /usr/lib/clang/6.0.1/include -internal-externc-isystem /include -internal-externc-isystem /usr/include -std=c++17 -fdeprecated-macro -fdebug-compilation-dir /home/firstlove/p
rojects/smallProjects/smalltools/findpath -ferror-limit 19 -fmessage-length 176 -stack-protector 2 -fobjc-runtime=gcc -fcxx-exceptions -fexceptions -fdiagnostics-show-option -f
color-diagnostics -o /tmp/findpath-671136.o -x c++ findpath.cpp
clang -cc1 version 6.0.1 based upon LLVM 6.0.1 default target x86_64-pc-linux-gnu
ignoring nonexistent directory "/include"
#include "..." search starts here:
#include <...> search starts here:
/usr/bin/../include/c++/v1
/usr/local/include
/usr/lib/clang/6.0.1/include
/usr/include
End of search list.
"/usr/bin/ld.lld" -pie --eh-frame-hdr -m elf_x86_64 -dynamic-linker /lib64/ld-linux-x86-64.so.2 -o a.out /usr/bin/../lib64/gcc/x86_64-pc-linux-gnu/8.2.0/../../../../lib64/Scrt
1.o /usr/bin/../lib64/gcc/x86_64-pc-linux-gnu/8.2.0/../../../../lib64/crti.o /usr/bin/../lib64/gcc/x86_64-pc-linux-gnu/8.2.0/crtbeginS.o -L/usr/bin/../lib64/gcc/x86_64-pc-linux
-gnu/8.2.0 -L/usr/bin/../lib64/gcc/x86_64-pc-linux-gnu/8.2.0/../../../../lib64 -L/usr/bin/../lib64 -L/lib/../lib64 -L/usr/lib/../lib64 -L/usr/bin/../lib64/gcc/x86_64-pc-linux-g
nu/8.2.0/../../.. -L/usr/bin/../lib -L/lib -L/usr/lib -lc++abi /tmp/findpath-671136.o -lc++ -lm -lgcc_s -lgcc -lc -lgcc_s -lgcc /usr/bin/../lib64/gcc/x86_64-pc-linux-gnu/8.2.0/
crtendS.o /usr/bin/../lib64/gcc/x86_64-pc-linux-gnu/8.2.0/../../../../lib64/crtn.o
~/.../smalltools/findpath >>> ±[A1●●][master]
~/.../smalltools/findpath >>> ./a.out ±[A1●●][master]
Hi%