Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Clang 3.9 linker issue #683

Closed
petricm opened this issue Jul 2, 2020 · 4 comments · Fixed by #684 or #685
Closed

Clang 3.9 linker issue #683

petricm opened this issue Jul 2, 2020 · 4 comments · Fixed by #684 or #685

Comments

@petricm
Copy link

petricm commented Jul 2, 2020

There is a linking issue of master for clang 3.9(gcc 6.2)

[ 35%] Building CXX object DDCore/CMakeFiles/DDCore.dir/G__DD4hepGeo.cxx.o
In file included from /cvmfs/clicdp.cern.ch/iLCSoft/builds/nightly/x86_64-slc6-llvm39-opt/DD4hep/HEAD/build/DDCore/G__DD4hep.cxx:40:
In file included from /cvmfs/clicdp.cern.ch/iLCSoft/builds/nightly/x86_64-slc6-llvm39-opt/DD4hep/HEAD/DDCore/include/DD4hep/AlignmentData.h:18:
In file included from /cvmfs/clicdp.cern.ch/iLCSoft/builds/nightly/x86_64-slc6-llvm39-opt/DD4hep/HEAD/DDCore/include/DD4hep/DetElement.h:19:
/cvmfs/clicdp.cern.ch/iLCSoft/builds/nightly/x86_64-slc6-llvm39-opt/DD4hep/HEAD/DDCore/include/DD4hep/Objects.h:216:5: warning: definition of implicit copy assignment operator for 'Constant' is deprecated because it has a user-declared copy constructor [-Wdeprecated]
    Constant(const Constant& e) = default;
    ^
/cvmfs/clicdp.cern.ch/compilers/gcc/6.2.0/x86_64-slc6/lib/gcc/x86_64-pc-linux-gnu/6.2.0/../../../../include/c++/6.2.0/type_traits:1260:16: note: in instantiation of template class 'std::__is_assignable_helper<dd4hep::Constant &, const dd4hep::Constant &>' requested here
      : public __is_assignable_helper<_Tp, _Up>::type
               ^
/cvmfs/clicdp.cern.ch/compilers/gcc/6.2.0/x86_64-slc6/lib/gcc/x86_64-pc-linux-gnu/6.2.0/../../../../include/c++/6.2.0/type_traits:1272:14: note: in instantiation of template class 'std::is_assignable<dd4hep::Constant &, const dd4hep::Constant &>' requested here
    : public is_assignable<_Tp&, const _Tp&>
             ^
/cvmfs/clicdp.cern.ch/compilers/gcc/6.2.0/x86_64-slc6/lib/gcc/x86_64-pc-linux-gnu/6.2.0/../../../../include/c++/6.2.0/type_traits:1278:14: note: in instantiation of template class 'std::__is_copy_assignable_impl<dd4hep::Constant, true>' requested here
    : public __is_copy_assignable_impl<_Tp>
             ^
/cvmfs/clicdp.cern.ch/compilers/gcc/6.2.0/x86_64-slc6/lib/gcc/x86_64-pc-linux-gnu/6.2.0/../../../../include/c++/6.2.0/bits/stl_uninitialized.h:571:33: note: in instantiation of template class 'std::is_copy_assignable<dd4hep::Constant>' requested here
      const bool __assignable = is_copy_assignable<_ValueType>::value;
                                ^
/cvmfs/clicdp.cern.ch/compilers/gcc/6.2.0/x86_64-slc6/lib/gcc/x86_64-pc-linux-gnu/6.2.0/../../../../include/c++/6.2.0/bits/stl_uninitialized.h:637:19: note: in instantiation of function template specialization 'std::__uninitialized_default_n<dd4hep::Constant *, unsigned long>' requested here
    { return std::__uninitialized_default_n(__first, __n); }
                  ^
/cvmfs/clicdp.cern.ch/compilers/gcc/6.2.0/x86_64-slc6/lib/gcc/x86_64-pc-linux-gnu/6.2.0/../../../../include/c++/6.2.0/bits/vector.tcc:549:8: note: in instantiation of function template specialization 'std::__uninitialized_default_n_a<dd4hep::Constant *, unsigned long, dd4hep::Constant>' requested here
                std::__uninitialized_default_n_a(this->_M_impl._M_finish,
                     ^
/cvmfs/clicdp.cern.ch/compilers/gcc/6.2.0/x86_64-slc6/lib/gcc/x86_64-pc-linux-gnu/6.2.0/../../../../include/c++/6.2.0/bits/stl_vector.h:677:4: note: in instantiation of member function 'std::vector<dd4hep::Constant, std::allocator<dd4hep::Constant> >::_M_default_append' requested here
          _M_default_append(__new_size - size());
          ^
/cvmfs/clicdp.cern.ch/software/ROOT/6.08.00/x86_64-slc6-llvm39-opt/include/TCollectionProxyInfo.h:378:13: note: in instantiation of member function 'std::vector<dd4hep::Constant, std::allocator<dd4hep::Constant> >::resize' requested here
         c->resize(n);
            ^
/cvmfs/clicdp.cern.ch/software/ROOT/6.08.00/x86_64-slc6-llvm39-opt/include/TCollectionProxyInfo.h:579:51: note: in instantiation of member function 'ROOT::Detail::TCollectionProxyInfo::Pushback<std::vector<dd4hep::Constant, std::allocator<dd4hep::Constant> > >::resize' requested here
                                               T::resize,
                                                  ^
/cvmfs/clicdp.cern.ch/iLCSoft/builds/nightly/x86_64-slc6-llvm39-opt/DD4hep/HEAD/build/DDCore/G__DD4hep.cxx:8511:63: note: in instantiation of function template specialization 'ROOT::Detail::TCollectionProxyInfo::Generate<ROOT::Detail::TCollectionProxyInfo::Pushback<std::vector<dd4hep::Constant, std::allocator<dd4hep::Constant> > > >' requested here
      instance.AdoptCollectionProxyInfo(TCollectionProxyInfo::Generate(TCollectionProxyInfo::Pushback< vector<dd4hep::Constant> >()));
                                                              ^
/cvmfs/clicdp.cern.ch/compilers/gcc/6.2.0/x86_64-slc6/lib/gcc/x86_64-pc-linux-gnu/6.2.0/../../../../include/c++/6.2.0/type_traits:1245:45: note: implicit copy assignment operator for 'Constant' first required here
               typename = decltype(declval<_Tp1>() = declval<_Up1>())>
                                                   ^
1 warning generated.
[ 36%] Linking CXX shared library ../lib/libDDCore.so
CMakeFiles/DDCore.dir/src/IOV.cpp.o: In function `dd4hep::IOV::IOV(dd4hep::IOVType const*)':
/cvmfs/clicdp.cern.ch/compilers/gcc/6.2.0/x86_64-slc6/lib/gcc/x86_64-pc-linux-gnu/6.2.0/../../../../include/c++/6.2.0/bits/stl_pair.h:194: undefined reference to `dd4hep::IOV::MIN_KEY'
clang-3.9: error: linker command failed with exit code 1 (use -v to see invocation)
make[2]: *** [lib/libDDCore.so.1.12] Error 1
make[1]: *** [DDCore/CMakeFiles/DDCore.dir/all] Error 2
make: *** [all] Error 2
/cvmfs/clicdp.cern.ch/iLCSoft/builds/nightly/x86_64-slc6-llvm39-opt/DD4hep/HEAD/build
[  1%] Built target DD4hepGaudiPluginMgr
[  1%] Built target listcomponents
[ 11%] Built target DDParsers
[ 12%] Linking CXX shared library ../lib/libDDCore.so
CMakeFiles/DDCore.dir/src/IOV.cpp.o: In function `dd4hep::IOV::IOV(dd4hep::IOVType const*)':
/cvmfs/clicdp.cern.ch/compilers/gcc/6.2.0/x86_64-slc6/lib/gcc/x86_64-pc-linux-gnu/6.2.0/../../../../include/c++/6.2.0/bits/stl_pair.h:194: undefined reference to `dd4hep::IOV::MIN_KEY'
clang-3.9: error: linker command failed with exit code 1 (use -v to see invocation)
make[2]: *** [lib/libDDCore.so.1.12] Error 1
make[1]: *** [DDCore/CMakeFiles/DDCore.dir/all] Error 2
@petricm
Copy link
Author

petricm commented Jul 2, 2020

The linking still does not work

/usr/bin/ld -v --hash-style=gnu --eh-frame-hdr -m elf_x86_64 -shared -o ../lib/libDDCore.so.1.12 /usr/lib/../lib64/crti.o /cvmfs/clicdp.cern.ch/compilers/gcc/6.2.0/x86_64-slc6/lib/gcc/x86_64-pc-linux-gnu/6.2.0/crtbeginS.o -L/cvmfs/clicdp.cern.ch/compilers/gcc/6.2.0/x86_64-slc6/lib/gcc/x86_64-pc-linux-gnu/6.2.0 -L/cvmfs/clicdp.cern.ch/compilers/gcc/6.2.0/x86_64-slc6/lib/gcc/x86_64-pc-linux-gnu/6.2.0/../../../../lib64 -L/lib/../lib64 -L/usr/lib/../lib64 -L/cvmfs/clicdp.cern.ch/compilers/gcc/6.2.0/x86_64-slc6/lib/gcc/x86_64-pc-linux-gnu/6.2.0/../../.. -L/cvmfs/clicdp.cern.ch/compilers/llvm/3.9.0/x86_64-slc6/bin/../lib -L/lib -L/usr/lib --no-undefined -soname libDDCore.so.1.12 CMakeFiles/DDCore.dir/src/AlignmentData.cpp.o CMakeFiles/DDCore.dir/src/AlignmentNominalMap.cpp.o CMakeFiles/DDCore.dir/src/AlignmentTools.cpp.o CMakeFiles/DDCore.dir/src/Alignments.cpp.o CMakeFiles/DDCore.dir/src/AlignmentsCalculator.cpp.o CMakeFiles/DDCore.dir/src/AlignmentsInterna.cpp.o CMakeFiles/DDCore.dir/src/AlignmentsPrinter.cpp.o CMakeFiles/DDCore.dir/src/AlignmentsProcessor.cpp.o CMakeFiles/DDCore.dir/src/BuildType.cpp.o CMakeFiles/DDCore.dir/src/Callback.cpp.o CMakeFiles/DDCore.dir/src/CartesianGridXY.cpp.o CMakeFiles/DDCore.dir/src/CartesianGridXYZ.cpp.o CMakeFiles/DDCore.dir/src/CartesianGridXZ.cpp.o CMakeFiles/DDCore.dir/src/CartesianGridYZ.cpp.o CMakeFiles/DDCore.dir/src/CartesianStripX.cpp.o CMakeFiles/DDCore.dir/src/CartesianStripY.cpp.o CMakeFiles/DDCore.dir/src/CartesianStripZ.cpp.o CMakeFiles/DDCore.dir/src/ComponentProperties.cpp.o CMakeFiles/DDCore.dir/src/ConditionDerived.cpp.o CMakeFiles/DDCore.dir/src/Conditions.cpp.o CMakeFiles/DDCore.dir/src/ConditionsData.cpp.o CMakeFiles/DDCore.dir/src/ConditionsDebug.cpp.o CMakeFiles/DDCore.dir/src/ConditionsInterna.cpp.o CMakeFiles/DDCore.dir/src/ConditionsListener.cpp.o CMakeFiles/DDCore.dir/src/ConditionsMap.cpp.o CMakeFiles/DDCore.dir/src/ConditionsPrinter.cpp.o CMakeFiles/DDCore.dir/src/ConditionsProcessor.cpp.o CMakeFiles/DDCore.dir/src/DD4hepRootPersistency.cpp.o CMakeFiles/DDCore.dir/src/DD4hepUI.cpp.o CMakeFiles/DDCore.dir/src/DetElement.cpp.o CMakeFiles/DDCore.dir/src/DetectorData.cpp.o CMakeFiles/DDCore.dir/src/DetectorHelper.cpp.o CMakeFiles/DDCore.dir/src/DetectorImp.cpp.o CMakeFiles/DDCore.dir/src/DetectorInterna.cpp.o CMakeFiles/DDCore.dir/src/DetectorLoad.cpp.o CMakeFiles/DDCore.dir/src/DetectorProcessor.cpp.o CMakeFiles/DDCore.dir/src/DetectorSelector.cpp.o CMakeFiles/DDCore.dir/src/DetectorTools.cpp.o CMakeFiles/DDCore.dir/src/Errors.cpp.o CMakeFiles/DDCore.dir/src/Exceptions.cpp.o CMakeFiles/DDCore.dir/src/ExtensionEntry.cpp.o CMakeFiles/DDCore.dir/src/FieldTypes.cpp.o CMakeFiles/DDCore.dir/src/Fields.cpp.o CMakeFiles/DDCore.dir/src/GeoHandler.cpp.o CMakeFiles/DDCore.dir/src/GeometryTreeDump.cpp.o CMakeFiles/DDCore.dir/src/GlobalAlignment.cpp.o CMakeFiles/DDCore.dir/src/Grammar.cpp.o CMakeFiles/DDCore.dir/src/GrammarTypes.cpp.o CMakeFiles/DDCore.dir/src/Handle.cpp.o CMakeFiles/DDCore.dir/src/IDDescriptor.cpp.o CMakeFiles/DDCore.dir/src/IOV.cpp.o CMakeFiles/DDCore.dir/src/InstanceCount.cpp.o CMakeFiles/DDCore.dir/src/MatrixHelpers.cpp.o CMakeFiles/DDCore.dir/src/MultiSegmentation.cpp.o CMakeFiles/DDCore.dir/src/NamedObject.cpp.o CMakeFiles/DDCore.dir/src/NoSegmentation.cpp.o CMakeFiles/DDCore.dir/src/ObjectExtensions.cpp.o CMakeFiles/DDCore.dir/src/ObjectPrintout.cpp.o CMakeFiles/DDCore.dir/src/Objects.cpp.o CMakeFiles/DDCore.dir/src/ObjectsInterna.cpp.o CMakeFiles/DDCore.dir/src/OpaqueData.cpp.o CMakeFiles/DDCore.dir/src/OpaqueDataBinder.cpp.o CMakeFiles/DDCore.dir/src/OpticalSurfaceManager.cpp.o CMakeFiles/DDCore.dir/src/OpticalSurfaceManagerInterna.cpp.o CMakeFiles/DDCore.dir/src/OpticalSurfaces.cpp.o CMakeFiles/DDCore.dir/src/Path.cpp.o CMakeFiles/DDCore.dir/src/PluginCreators.cpp.o CMakeFiles/DDCore.dir/src/PluginTester.cpp.o CMakeFiles/DDCore.dir/src/Plugins.cpp.o CMakeFiles/DDCore.dir/src/PolarGridRPhi.cpp.o CMakeFiles/DDCore.dir/src/PolarGridRPhi2.cpp.o CMakeFiles/DDCore.dir/src/Primitives.cpp.o CMakeFiles/DDCore.dir/src/Printout.cpp.o CMakeFiles/DDCore.dir/src/PropertyTable.cpp.o CMakeFiles/DDCore.dir/src/Readout.cpp.o CMakeFiles/DDCore.dir/src/Segmentations.cpp.o CMakeFiles/DDCore.dir/src/SegmentationsInterna.cpp.o CMakeFiles/DDCore.dir/src/ShapeUtilities.cpp.o CMakeFiles/DDCore.dir/src/Shapes.cpp.o CMakeFiles/DDCore.dir/src/ShapesInterna.cpp.o CMakeFiles/DDCore.dir/src/SimpleGDMLWriter.cpp.o CMakeFiles/DDCore.dir/src/SurfaceInstaller.cpp.o CMakeFiles/DDCore.dir/src/VolumeManager.cpp.o CMakeFiles/DDCore.dir/src/VolumeProcessor.cpp.o CMakeFiles/DDCore.dir/src/Volumes.cpp.o CMakeFiles/DDCore.dir/src/WaferGridXY.cpp.o CMakeFiles/DDCore.dir/src/World.cpp.o CMakeFiles/DDCore.dir/src/XML/Detector.cpp.o CMakeFiles/DDCore.dir/src/XML/DocumentHandler.cpp.o CMakeFiles/DDCore.dir/src/XML/Layering.cpp.o CMakeFiles/DDCore.dir/src/XML/UriReader.cpp.o CMakeFiles/DDCore.dir/src/XML/Utilities.cpp.o CMakeFiles/DDCore.dir/src/XML/VolumeBuilder.cpp.o CMakeFiles/DDCore.dir/src/XML/XMLElements.cpp.o CMakeFiles/DDCore.dir/src/XML/XMLHelpers.cpp.o CMakeFiles/DDCore.dir/src/XML/XMLParsers.cpp.o CMakeFiles/DDCore.dir/src/XML/XMLTags.cpp.o CMakeFiles/DDCore.dir/src/segmentations/BitField64.cpp.o CMakeFiles/DDCore.dir/src/segmentations/BitFieldCoder.cpp.o CMakeFiles/DDCore.dir/src/segmentations/CartesianGrid.cpp.o CMakeFiles/DDCore.dir/src/segmentations/CartesianGridXY.cpp.o CMakeFiles/DDCore.dir/src/segmentations/CartesianGridXYZ.cpp.o CMakeFiles/DDCore.dir/src/segmentations/CartesianGridXZ.cpp.o CMakeFiles/DDCore.dir/src/segmentations/CartesianGridYZ.cpp.o CMakeFiles/DDCore.dir/src/segmentations/CartesianStrip.cpp.o CMakeFiles/DDCore.dir/src/segmentations/CartesianStripX.cpp.o CMakeFiles/DDCore.dir/src/segmentations/CartesianStripY.cpp.o CMakeFiles/DDCore.dir/src/segmentations/CartesianStripZ.cpp.o CMakeFiles/DDCore.dir/src/segmentations/CylindricalSegmentation.cpp.o CMakeFiles/DDCore.dir/src/segmentations/GridPhiEta.cpp.o CMakeFiles/DDCore.dir/src/segmentations/GridRPhiEta.cpp.o CMakeFiles/DDCore.dir/src/segmentations/MegatileLayerGridXY.cpp.o CMakeFiles/DDCore.dir/src/segmentations/MultiSegmentation.cpp.o CMakeFiles/DDCore.dir/src/segmentations/NoSegmentation.cpp.o CMakeFiles/DDCore.dir/src/segmentations/PolarGrid.cpp.o CMakeFiles/DDCore.dir/src/segmentations/PolarGridRPhi.cpp.o CMakeFiles/DDCore.dir/src/segmentations/PolarGridRPhi2.cpp.o CMakeFiles/DDCore.dir/src/segmentations/ProjectiveCylinder.cpp.o CMakeFiles/DDCore.dir/src/segmentations/Segmentation.cpp.o CMakeFiles/DDCore.dir/src/segmentations/SegmentationFactory.cpp.o CMakeFiles/DDCore.dir/src/segmentations/TiledLayerGridXY.cpp.o CMakeFiles/DDCore.dir/src/segmentations/TiledLayerSegmentation.cpp.o CMakeFiles/DDCore.dir/src/segmentations/WaferGridXY.cpp.o CMakeFiles/DDCore.dir/src/JSON/Detector.cpp.o CMakeFiles/DDCore.dir/src/JSON/DocumentHandler.cpp.o CMakeFiles/DDCore.dir/src/JSON/Elements.cpp.o CMakeFiles/DDCore.dir/src/JSON/Helpers.cpp.o CMakeFiles/DDCore.dir/G__DD4hep.cxx.o CMakeFiles/DDCore.dir/G__DD4hepSegmentations.cxx.o CMakeFiles/DDCore.dir/G__DD4hepProperties.cxx.o CMakeFiles/DDCore.dir/G__DD4hepGeo.cxx.o -rpath /DD4hep/build/lib:/cvmfs/clicdp.cern.ch/software/ROOT/6.08.00/x86_64-slc6-llvm39-opt/lib: ../lib/libDDParsers.so.1.12 -ldl /cvmfs/clicdp.cern.ch/software/ROOT/6.08.00/x86_64-slc6-llvm39-opt/lib/libGenVector.so /cvmfs/clicdp.cern.ch/software/ROOT/6.08.00/x86_64-slc6-llvm39-opt/lib/libRint.so /cvmfs/clicdp.cern.ch/software/ROOT/6.08.00/x86_64-slc6-llvm39-opt/lib/libTree.so /cvmfs/clicdp.cern.ch/software/ROOT/6.08.00/x86_64-slc6-llvm39-opt/lib/libNet.so /cvmfs/clicdp.cern.ch/software/ROOT/6.08.00/x86_64-slc6-llvm39-opt/lib/libPhysics.so /cvmfs/clicdp.cern.ch/software/ROOT/6.08.00/x86_64-slc6-llvm39-opt/lib/libMatrix.so /cvmfs/clicdp.cern.ch/software/ROOT/6.08.00/x86_64-slc6-llvm39-opt/lib/libGeom.so /cvmfs/clicdp.cern.ch/software/ROOT/6.08.00/x86_64-slc6-llvm39-opt/lib/libRIO.so /cvmfs/clicdp.cern.ch/software/ROOT/6.08.00/x86_64-slc6-llvm39-opt/lib/libThread.so /cvmfs/clicdp.cern.ch/software/ROOT/6.08.00/x86_64-slc6-llvm39-opt/lib/libMathCore.so /cvmfs/clicdp.cern.ch/software/ROOT/6.08.00/x86_64-slc6-llvm39-opt/lib/libCore.so -lstdc++ -lm -lgcc_s -lpthread -lc -lgcc_s /cvmfs/clicdp.cern.ch/compilers/gcc/6.2.0/x86_64-slc6/lib/gcc/x86_64-pc-linux-gnu/6.2.0/crtendS.o /usr/lib/../lib64/crtn.o

returns

GNU ld version 2.20.51.0.2-5.48.el6_10.1 20100205
CMakeFiles/DDCore.dir/src/IOV.cpp.o: In function `dd4hep::IOV::IOV(dd4hep::IOVType const*)':
/DD4hep/DDCore/src/IOV.cpp:(.text+0xc6): undefined reference to `dd4hep::IOV::MIN_KEY'

If you want compiler and dependencies for clang 3.9

source /cvmfs/clicdp.cern.ch/iLCSoft/builds/nightly/x86_64-slc6-llvm39-opt/init_ilcsoft.sh 

@MarkusFrankATcernch
Copy link
Contributor

MarkusFrankATcernch commented Jul 2, 2020

I could reproduce the linker error.
But:
Clang 3.9 is apparently not standard compliant.
The definition of

static const constexpr Key_value_type MIN_KEY = std::numeric_limits<Key_value_type>::min();
static const constexpr Key_value_type MAX_KEY = std::numeric_limits<Key_value_type>::max();

inside the IOV class is allowed. This should not produce a linker error and also does not produce one on other
compilers. Is clang3.9 so important to justify ifdef'ing with the compiler type and version ?
Remark: This error only happens for C++ 14. C++ 17 seems to be OK.

@andresailer
Copy link
Member

This

If a static data member is declared constexpr, it is implicitly inline and does not need to be redeclared at namespace scope. This redeclaration without an initializer (formerly required as shown above) is still permitted, but is deprecated. (since c++17)

from https://en.cppreference.com/w/cpp/language/static (constant static members) ?

Maybe clang 3.9 is overly standard compliant?

@andresailer
Copy link
Member

andresailer commented Jul 3, 2020

Minimal example

#include <algorithm>
#include <cstdint>
#include <limits>
#include <iostream>

class IOV
{
public:
  static constexpr std::int64_t MIN_KEY = std::numeric_limits<std::int64_t>::min();
};

//without this in c++14, linking will fail on gcc 9.2.0, clang3.9 (did not test others)
//const std::int64_t IOV::MIN_KEY;
  
int main ()
{
  auto& mini = std::min(IOV::MIN_KEY, std::int64_t(0));
  std::cout << mini  << std::endl;
  return 0;
}

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
3 participants