On Mon, Aug 23, 2021 at 4:13 PM Ben Beasley <c...@musicinmybrain.net> wrote:

> The same specialization of ProcessorCache:
>
>    template class ProcessorCache<std::size_t, ProcessorRcPtr>;
>
> is explicitly instantiated in two different translation units:
>
>     src/OpenColorIO/Processor.cpp
>     src/OpenColorIO/Config.cpp
>
> which violates the C++ standard (an explicit instantiation definition
> shall appear at most once in a program).
>
> Since you are compiling with C++11 (vs. C++98), you can change the line
> in Config.cpp to
>
>    extern template class ProcessorCache<std::size_t, ProcessorRcPtr>;
>
> and it should be fine (in theory, I haven’t run a scratch build).
>
> -----
>
> Side note: while CMake build systems tend to hard-code a C++ standard
> version, it’s better in my opinion if we can override it to match the
> default in GCC, currently C++17, since C++ code compiled with different
> standard versions is not ABI-compatible. For CMake, this often looks
> like -DCMAKE_CXX_STANDARD=17. (I don’t know a good way to obtain this
> value automatically.) To me, this is in the spirit of respecting the
> distribution’s build flags.
>

No, I don't think that this is a safe thing to do on a distribution level -
overriding the chosen C++ standard of a project is not respecting
upstream's decision, and could cause problems. For example, if upstream
wants C++11 and uses std::auto_ptr, compiling with C++17 or C++20 would
then break compilation because it was removed in those standard versions.


>
> When each C++ library is compiled with its own upstream-preferred C
> standard version, it’s perfectly possible that an application might have
> dependencies using mutually exclusive C++ ABIs, in which case it would
> be impossible to package without bundled dependencies in Fedora. Or,
> things might appear to work but there could be problems at runtime or
> confusing linker errors down the road.
>
>
Do you have a reference for that? I thought the C++ ABI we are talking
about here is compiler-dependent and not standard-depdenent (e.g.
https://gcc.gnu.org/onlinedocs/gcc/C_002b_002b-Dialect-Options.html#C_002b_002b-Dialect-Options),
so there is the possibility of having problems if we build half the distro
with one GCC version and the other half with a different one (hence why we
generally do a mass rebuild after the GCC toolchain is updated to its new
stable ABI). While there has been one very large change to my knowledge
(e.g. std::string in C++11), the C++ standard seems to have tried very hard
(to the point of rejecting changes that would violate it) to allow the ABI
to be forward compatible between standard versions


> It’s not a theoretical problem: grpc builds as C++17, and links against
> abseil-cpp which builds as C++17, but runs its unit tests using gtest
> which is built in Fedora as C++11. This means grpc has to bundle its own
> copy of gtest and build it as C++17. In this case, gtest is not exactly
> a bundled library in the usual sense, since it can be proven that
> nothing from gtest is linked into the installed libraries or executables.
>
> Of course, in some cases there are ecosystems of packages in Fedora that
> are all currently hard-coding C++11, which happens to work well for
> now—and adjusting one would mean adjusting them all. So the issue of C++
> ABI version is a potentially ugly one either way.
>
> On 8/23/21 10:19 AM, Richard Shaw wrote:
> > I'm working on updating OpenColorIO to 2.0.1 and building in a side tag,
> > however, the build failed but only on armv7hf with:
> >
> > usr/lib/libpystring.so /usr/lib/libyaml-cpp.so.0.6.3
> > ../testutils/libtestutils.a -lm ../../src/apputils/libapputils.a
> > /usr/bin/ld: CMakeFiles/test_cpu_exec.dir/Processor_tests.cpp.o (symbol
> > from plugin): in function
> > `OpenColorIO_v2_0::ProcessorMetadata::ProcessorMetadata()':
> > (.text+0x0): multiple definition of `typeinfo name for
> > OpenColorIO_v2_0::ProcessorCache<unsigned int,
> > std::shared_ptr<OpenColorIO_v2_0::Processor> >';
> > CMakeFiles/test_cpu_exec.dir/Config_tests.cpp.o (symbol from
> > plugin):(.text+0x0): first defined here
> > /usr/bin/ld: CMakeFiles/test_cpu_exec.dir/Processor_tests.cpp.o (symbol
> > from plugin): in function
> > `OpenColorIO_v2_0::ProcessorMetadata::ProcessorMetadata()':
> > (.text+0x0): multiple definition of `typeinfo for
> > OpenColorIO_v2_0::ProcessorCache<unsigned int,
> > std::shared_ptr<OpenColorIO_v2_0::Processor> >';
> > CMakeFiles/test_cpu_exec.dir/Config_tests.cpp.o (symbol from
> > plugin):(.text+0x0): first defined here
> > collect2: error: ld returned 1 exit status
> >
> > Ideas?
> >
> > Thanks,
> > Richard
> >
> > _______________________________________________
> > devel mailing list -- devel@lists.fedoraproject.org
> > To unsubscribe send an email to devel-le...@lists.fedoraproject.org
> > Fedora Code of Conduct:
> https://docs.fedoraproject.org/en-US/project/code-of-conduct/
> > List Guidelines: https://fedoraproject.org/wiki/Mailing_list_guidelines
> > List Archives:
> https://lists.fedoraproject.org/archives/list/devel@lists.fedoraproject.org
> > Do not reply to spam on the list, report it:
> https://pagure.io/fedora-infrastructure
> >
> _______________________________________________
> devel mailing list -- devel@lists.fedoraproject.org
> To unsubscribe send an email to devel-le...@lists.fedoraproject.org
> Fedora Code of Conduct:
> https://docs.fedoraproject.org/en-US/project/code-of-conduct/
> List Guidelines: https://fedoraproject.org/wiki/Mailing_list_guidelines
> List Archives:
> https://lists.fedoraproject.org/archives/list/devel@lists.fedoraproject.org
> Do not reply to spam on the list, report it:
> https://pagure.io/fedora-infrastructure
>
_______________________________________________
devel mailing list -- devel@lists.fedoraproject.org
To unsubscribe send an email to devel-le...@lists.fedoraproject.org
Fedora Code of Conduct: 
https://docs.fedoraproject.org/en-US/project/code-of-conduct/
List Guidelines: https://fedoraproject.org/wiki/Mailing_list_guidelines
List Archives: 
https://lists.fedoraproject.org/archives/list/devel@lists.fedoraproject.org
Do not reply to spam on the list, report it: 
https://pagure.io/fedora-infrastructure

Reply via email to