[cfe-users] libcxx.llvm.org linux build instructions unclear

Larry Evans cppljevans at suddenlink.net
Mon Jul 14 07:05:34 PDT 2014


On 07/14/2014 08:40 AM, Larry Evans wrote:
> On 07/13/2014 10:54 PM, Larry Evans wrote:
>> On 07/10/2014 03:46 PM, Larry Evans wrote:
>>> On 07/10/2014 03:23 PM, Jeffrey Walton wrote:
>>>>> Unfortunately, when using libcxx with a hello_world.cpp, get missing
>>>>> files:
>>>>>
>>>>> make
>>>>> ls -ld /usr/local/lib/libc++*
>>>>> lrwxrwxrwx 1 root root      11 Jul 10 12:45
>>>>> /usr/local/lib/libc++.so ->
>>>>> libc++.so.1
>>>>> lrwxrwxrwx 1 root root      13 Jul 10 12:45
>>>>> /usr/local/lib/libc++.so.1 ->
>>>>> libc++.so.1.0
>>>>> -rw-r--r-- 1 root root 1054759 Jul 10 11:53
>>>>> /usr/local/lib/libc++.so.1.0
>>>>> ls -ld /usr/local/include/c++/v1/../*
>>>>> drwxr-xr-x 19 root root 4096 Jul  7 12:11
>>>>> /usr/local/include/c++/v1/../4.9.0
>>>>> drwxr-xr-x  5 root root 4096 Jul 10 12:45
>>>>> /usr/local/include/c++/v1/../v1
>>>>> /usr/local/bin/clang++ -std=c++11 -stdlib=libc++ -nostdinc
>>>>> -I/usr/local/include/c++/v1 -I/usr/local/include/c++/v1/../4.9.0
>>>>> -L/usr/local/lib hello_world.cpp -o hello_world.exe
>>>>> In file included from hello_world.cpp:1:
>>>>> /usr/local/include/c++/v1/../4.9.0/iostream:38:10: fatal error:
>>>>> 'bits/c++config.h' file not found
>>>>> #include <bits/c++config.h>
>>>>>           ^
>>>>> 1 error generated.
>>>>> make: *** [run] Error 1
>>>>>
>>>>> Anyone have any ideas how to get libcxx to work on ubuntu?
>>>>>
>>>> Its a distant memory, but....
>>>>
>>>> I seem to recall I had to use -I to include the path to the correct
>>>> headers like <bits/c++config.h>. This was on Debian with an updated
>>>> Clang (I built and used 3.3 in /usr/local/bin, while Debian provided
>>>> 3.1, IIRC).
>>>>
>>>> Jeff
>>>>
>>> Thanks Jeff.  That got me a little farther, but now missing other
>>> files.  First had to add another -I for features.h, but now I'm
>>> getting compile error as well as another missing file:
>>>
>>> make
>>> ls -ld /usr/local/lib/libc++*
>>> lrwxrwxrwx 1 root root      11 Jul 10 12:45 /usr/local/lib/libc++.so ->
>>> libc++.so.1
>>> lrwxrwxrwx 1 root root      13 Jul 10 12:45 /usr/local/lib/libc++.so.1
>>> -> libc++.so.1.0
>>> -rw-r--r-- 1 root root 1054759 Jul 10 11:53 /usr/local/lib/libc++.so.1.0
>>> ls -ld /usr/local/include/c++/v1/../*
>>> drwxr-xr-x 19 root root 4096 Jul  7 12:11
>>> /usr/local/include/c++/v1/../4.9.0
>>> drwxr-xr-x  5 root root 4096 Jul 10 12:45
>>> /usr/local/include/c++/v1/../v1
>>> /usr/local/bin/clang++ -std=c++11 -stdlib=libc++ -nostdinc
>>> -I/usr/local/include/c++/v1
>>> -I/usr/local/include/c++/4.9.0/x86_64-unknown-linux-gnu
>>> -I/usr/local/include/c++/4.9.0 -I/usr/local/include/c++/4.9.0/parallel
>>> -L/usr/local/lib hello_world.cpp -o hello_world.exe
>>> In file included from hello_world.cpp:1:
>>> In file included from /usr/local/include/c++/4.9.0/iostream:38:
>>> In file included from
>>> /usr/local/include/c++/4.9.0/x86_64-unknown-linux-gnu/bits/c++config.h:430:
>>>
>>>
>>> /usr/local/include/c++/4.9.0/x86_64-unknown-linux-gnu/bits/os_defines.h:44:19:
>>>
>>>
>>> error: token is not a valid binary operator in a
>>>        preprocessor subexpression
>>> #if __GLIBC_PREREQ(2,15) && defined(_GNU_SOURCE)
>>>      ~~~~~~~~~~~~~~^
>>> In file included from hello_world.cpp:1:
>>> In file included from /usr/local/include/c++/4.9.0/iostream:39:
>>> In file included from /usr/local/include/c++/4.9.0/ostream:38:
>>> In file included from /usr/local/include/c++/4.9.0/ios:38:
>>> In file included from /usr/local/include/c++/4.9.0/iosfwd:40:
>>> In file included from /usr/local/include/c++/4.9.0/bits/postypes.h:40:
>>> /usr/local/include/c++/4.9.0/cwchar:44:10: fatal error: 'wchar.h' file
>>> not found
>>> #include <wchar.h>
>>>           ^
>>> 2 errors generated.
>>> make: *** [run] Error 1
>>>
>>> Compilation exited abnormally with code 2 at Thu Jul 10 15:42:43
>>>
>>> -regards,
>>> Larry
>> I cleared the build directory and started over.  The difference this
>> time was I specified the CC= (in addition to the CXX=.  IOW:
>>
>> CC=clang CXX=clang++ cmake -G "Unix Makefiles"
>> -DLIBCXX_CXX_ABI=libstdc++
>> -DLIBCXX_LIBSUPCXX_INCLUDE_PATHS="/usr/local/include/c++/4.9.0/;/usr/local/include/c++/4.9.0/x86_64-unknown-linux-gnu/"
>>
>> -DCMAKE_BUILD_TYPE=Release -DCMAKE_INSTALL_PREFIX=/usr/local ../..
>>
>> where the last ../.. is the libcxx source.
>>
>> I also had to add -Wl,-lstdc++ to the link command when
>> compiling&linking a hello_world.cpp program.  This avoided
>> this link error:
>>
>> /usr/local/bin/clang++ -std=c++1y -stdlib=libc++ hello_world.cpp -o
>> hello_world.exe
>>      /usr/bin/ld: /tmp/hello_world-3c8536.o: undefined reference to
>> symbol '__cxa_free_exception@@CXXABI_1.3'
>>      //usr/lib/x86_64-linux-gnu/libstdc++.so.6: error adding symbols:
>> DSO missing from command line
>>      clang: error: linker command failed with exit code 1 (use -v to see
>> invocation)
>>
>> Hope this helps someone else.
>>
>> -regards,
>> Larry
> CORRECTION:
>
> For some unknown reason, the same hello_world.cpp program is no longer
> linking because `GNU ld` can't find the libc++.so even though it's
> there, as shown by:
>
> make -k
> ls -ld /usr/local/lib/libc++*
> lrwxrwxrwx 1 root root      11 Jul 10 12:45 /usr/local/lib/libc++.so ->
> libc++.so.1
> lrwxrwxrwx 1 root root      13 Jul 10 12:45 /usr/local/lib/libc++.so.1
> -> libc++.so.1.0
> -rw-r--r-- 1 root root 1039766 Jul 13 20:57 /usr/local/lib/libc++.so.1.0
> ls -ld /usr/local/include/c++/v1/../*
> drwxr-xr-x 19 root root 4096 Jul  7 12:11
> /usr/local/include/c++/v1/../4.9.0
> drwxr-xr-x  5 root root 4096 Jul 13 20:59 /usr/local/include/c++/v1/../v1
> /usr/local/bin/clang++ -std=c++1y -stdlib=libc++ -Wl,-lstdc++ -Wl,-v
> hello_world.cpp -o hello_world.exe
> GNU ld (GNU Binutils for Ubuntu) 2.24
> ./hello_world.exe
> ./hello_world.exe: error while loading shared libraries: libc++.so.1:
> cannot open shared object file: No such file or directory
> make: *** [run] Error 127
>
> Compilation exited abnormally with code 2 at Mon Jul 14 08:37:17
>
> Anyone have any idea what's going on?
>
> -regards,
> Larry
Runs again, by passing more flags to linker.  The manpage for gnu ld
has:

   The -rpath option is also used when locating shared objects which are
   needed by shared objects explicitly included in the link;

so added the directory where libc++ is located to -rpath link flag,
resulting in OK link.  I've no idea why it worked yesterday without
this flag :(.

Here's the compile&link&run:

make -k
ls -ld /usr/local/lib/libc++*
lrwxrwxrwx 1 root root      11 Jul 10 12:45 /usr/local/lib/libc++.so -> 
libc++.so.1
lrwxrwxrwx 1 root root      13 Jul 10 12:45 /usr/local/lib/libc++.so.1 
-> libc++.so.1.0
-rw-r--r-- 1 root root 1039766 Jul 13 20:57 /usr/local/lib/libc++.so.1.0
ls -ld /usr/local/include/c++/v1/../*
drwxr-xr-x 19 root root 4096 Jul  7 12:11 /usr/local/include/c++/v1/../4.9.0
drwxr-xr-x  5 root root 4096 Jul 13 20:59 /usr/local/include/c++/v1/../v1
/usr/local/bin/clang++ -std=c++1y -stdlib=libc++ -Wl,-v -Wl,-lstdc++ 
-L/usr/local/lib -Wl,-rpath -Wl,/usr/local/lib hello_world.cpp -o 
hello_world.exe
GNU ld (GNU Binutils for Ubuntu) 2.24
./hello_world.exe
hello World

Compilation finished at Mon Jul 14 08:56:56





More information about the cfe-users mailing list