Using <filesystem> on macOS 10.13 with clang++-mp-13
Ruben Di Battista
rubendibattista at gmail.com
Wed Jul 6 20:27:37 UTC 2022
More context:
basically it fills up (+ add the right library to link against) the `
filesystem.h.in` header template with the right #include and namespace
based on what is found on the platform. The idea was to use <filesystem> or
<experimental/filesystem> where available, and fallback to
https://github.com/gulrak/filesystem where not available.
On Wed, Jul 6, 2022 at 10:24 PM Ruben Di Battista <rubendibattista at gmail.com>
wrote:
> A partial solution I implemented using `cmake` for a project of mine:
>
> 1.
> https://gitlab.com/rdbisme/mercurve/-/blob/master/cmake/ConfigureFilesystemHeader.cmake
> 2. https://gitlab.com/rdbisme/mercurve/-/blob/master/src/filesystem.h.in
> 3.
> https://gitlab.com/rdbisme/mercurve/-/blob/master/src/apps/CMakeLists.txt#L20
>
>
>
> That can be improved for the use case here mentioned? The check for macOS
> is commented in the ConfigureFilesystemHeader, but maybe it can be
> completed to make it work.
>
>
> On Sun, Jul 3, 2022 at 8:38 PM Ken Cunningham <
> ken.cunningham.webuse at gmail.com> wrote:
>
>> This is an issue that will need solving, otherwise as filesystem is used
>> more (and it seems popular) all the systems prior to 10.15 will be left
>> behind.
>>
>> Filesystem uses features in libc++.dylib that are only present in 10.15
>> and newer. You are blocked from trying to use them on 10.14 and below by a
>> blocker in the clang "__config" header, that is easy to override, but when
>> you try to use filesystem, it will not find the libc++.dylib features and
>> will fail.
>>
>> You can (sometimes) use macports-libcxx to get past this. This however
>> introduces two versions of libc++.dylib into the softare mixture, and this
>> sometimes causes errors due to incompatibilities between libc++ versions
>> (ODR errors). If you are taking this route, linking in the newer libc++.a
>> statically has a higher chance of working properly (that is what Chrome
>> does on older MacOS systems).
>>
>> You can use gcc/libgcc, and newer versions of that have filesystem
>> support, but that causes it's own issues.
>>
>> There was an early version of filesystem available as
>> <experimental/filesystem> with a linking static library on older versions
>> of clang. I forget when that disappeared, but maybe clang-8.0. It is
>> possible that this might be brought forward to newer clangs and made
>> available to older systems with modest effort. This is likely the most
>> robust approach going forward, as it is the same code (although older).
>>
>> There are a few versions of filesystem available from other places, some
>> header-only, that might or might not work in a general sense. These have
>> the disadvantage of having nothing to do with clang/llvm, therefore I
>> presume the chances of unfavourable interactions would be somewhat higher.
>>
>> Hope this is helpful,
>>
>> Ken
>>
>> On Sun, Jul 3, 2022 at 4:12 AM Mojca Miklavec <mojca at macports.org> wrote:
>>
>>> Hi,
>>>
>>> I'm trying to build some sources that require <filesystem> on 10.13
>>> using clang 13 (I can try with clang 14, but I doubt that it helps).
>>>
>>> What's the correct way to compile the following minimal example? Do I
>>> need to link against a newer libc++ somehow?
>>>
>>> If it's not feasible to do that, I'll target a newer OS, I was just
>>> silently hoping to have some success ;)
>>>
>>> Thank you,
>>> Mojca
>>>
>>> #include <cstdlib>
>>> #include <filesystem>
>>>
>>> int main() {
>>> auto cwd = std::filesystem::current_path();
>>> printf("%s", cwd.c_str());
>>> return EXIT_SUCCESS;
>>> }
>>>
>>> > clang++-mp-13 test.cpp -o test
>>> test.cpp:5:16: error: no member named 'filesystem' in namespace 'std';
>>> did you mean 'std::__fs::filesystem'?
>>> auto cwd = std::filesystem::current_path();
>>> ^~~~~~~~~~~~~~~
>>> std::__fs::filesystem
>>> /opt/local/libexec/llvm-13/bin/../include/c++/v1/filesystem:268:1:
>>> note: 'std::__fs::filesystem' declared here
>>> _LIBCPP_BEGIN_NAMESPACE_FILESYSTEM
>>> ^
>>> /opt/local/libexec/llvm-13/bin/../include/c++/v1/__config:816:58:
>>> note: expanded from macro '_LIBCPP_BEGIN_NAMESPACE_FILESYSTEM'
>>> _LIBCPP_BEGIN_NAMESPACE_STD namespace __fs { namespace filesystem {
>>> ^
>>> 1 error generated.
>>>
>>> > clang++-mp-13 -std=c++17 test.cpp -o test
>>> Undefined symbols for architecture x86_64:
>>> "std::__1::__fs::filesystem::__current_path(std::__1::error_code*)",
>>> referenced from:
>>> std::__1::__fs::filesystem::current_path() in test-1b2bbf.o
>>> ld: symbol(s) not found for architecture x86_64
>>> clang: error: linker command failed with exit code 1 (use -v to see
>>> invocation)
>>>
>>
>
> --
> ..
> /**\
> /****\
> /\****/\
> / \**/ \
> / \/ \
> / /\ /\
> / \ / \ / \
> / \ / \/ \
> \ /\ /\ /
> \ / \ / \ /
> \/ \/ \/
> /\
> / +\
> \+ /
> \/
> rdb.is
> Book a meeting with me:
> https://calendly.com/rdbisme
>
>
>
--
..
/**\
/****\
/\****/\
/ \**/ \
/ \/ \
/ /\ /\
/ \ / \ / \
/ \ / \/ \
\ /\ /\ /
\ / \ / \ /
\/ \/ \/
/\
/ +\
\+ /
\/
rdb.is
Book a meeting with me:
https://calendly.com/rdbisme
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.macports.org/pipermail/macports-dev/attachments/20220706/2cc255d3/attachment-0001.htm>
More information about the macports-dev
mailing list