help-gplusplus
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Linking public: static const members in lib*.a's


From: STH
Subject: Linking public: static const members in lib*.a's
Date: Wed, 08 Sep 2004 01:27:05 -0400
User-agent: KNode/0.8.0

Sorry about the big code dump.  I tried to get it down to the minimum
required to demonstrate the problem.  On the following I run 
aclocal
autoheader
autoconf
automake -a -c --gnits
./configure
make

with the results shown at the end of the code listing.  The problem seems to
be related to my using static const class members.  Other similarly
configured programs work OK.  Can someone tell me what I'm doing wrong
here?

./configure.ac
#                                               -*- Autoconf -*-
# Process this file with autoconf to produce a configure script.

AC_PREREQ(2.59)
AC_INIT(testlibs, 0.1, hattons@here.com)
AC_CONFIG_SRCDIR([main.cpp])
AC_CONFIG_HEADER([config.h])

AM_INIT_AUTOMAKE
# Checks for programs.
AC_PROG_CXX
AC_PROG_CC

# Checks for libraries.
AC_PROG_RANLIB
# Checks for header files.

# Checks for typedefs, structures, and compiler characteristics.
AC_C_CONST
AC_C_INLINE

# Checks for library functions.

AC_CONFIG_FILES([Makefile
                 sth/Makefile
                 sth/util/Makefile])
AC_OUTPUT



./Makefile.am
INCLUDES = -I$(top_srcdir)/sth $(all_includes)
bin_PROGRAMS = testlibs
testlibs_SOURCES = main.cpp
testlibs_LDFLAGS = $(all_libraries)
testlibs_LDADD = $(top_builddir)/sth/libsth.a 
SUBDIRS = sth



./main.cpp
#include "ColorTest.h"
#include <iostream>

int main(int argc, char* argv[]) {
  using sth::ColorTest;
  ColorTest* ct = new ColorTest(std::cout);
}

./sth/Makefile.am
INCLUDES = -I$(top_srcdir)/sth/util $(all_includes)
SUBDIRS = util
lib_LIBRARIES = libsth.a
libsth_a_LIBADD = $(top_builddir)/sth/util/libutil.a
noinst_HEADERS = ColorTest.h
libsth_a_SOURCES = ColorTest.cpp


./sth/ColorTest.h
#ifndef STHCOLORTEST_H
#define STHCOLORTEST_H

#include <ostream>
namespace sth {
  class ColorTest {
  public:
    ColorTest(std::ostream& out);
    ~ColorTest();
  };
};

#endif


./sth/ColorTest.cpp
#include "ColorTest.h"
#include <iostream>

int main(int argc, char* argv[]) {
  using sth::ColorTest;
  ColorTest* ct = new ColorTest(std::cout);
}

./sth/util/Makefile.am
INCLUDES = -I$(all_includes)
lib_LIBRARIES = libutil.a
noinst_HEADERS = RgbColor.h Printable_IF.h
libutil_a_SOURCES = RgbColor.cpp


./sth/util/RgbColor.h
#ifndef UTILRGBCOLOR_H
#define UTILRGBCOLOR_H

#include "Printable_IF.h"
namespace sth
  {
  namespace util
    {

    /**
    @author Steven T. Hatton
    */

    class RgbColor
          : public Printable_IF
      {
      public:
        RgbColor(const unsigned char& r=255,
                 const unsigned char& g=127,
                 const unsigned char& b=127);
          
        unsigned char R() const;
        void R(const unsigned char& r);

        unsigned char G() const;
        void G(const unsigned char& g);

        unsigned char B() const;
        void B(const unsigned char& b);

        std::ostream& print(std::ostream& out) const;

        static const RgbColor RED;
        static const RgbColor GREEN;
        static const RgbColor BLUE;
        static const RgbColor BLACK;
        static const RgbColor WHITE;
        static const RgbColor MAGENTA;
        static const RgbColor CYAN;
        static const RgbColor YELLOW;
      private:
        unsigned char m_r;
        unsigned char m_g;
        unsigned char m_b;
      };

    inline unsigned char RgbColor::R() const
      {
        return m_r;
      }
    inline void RgbColor::R(const unsigned char& r)
    {
      m_r = r;
    }

    inline unsigned char RgbColor::G() const
      {
        return m_g;
      }

    inline void RgbColor::G(const unsigned char& g)
    {
      m_g = g;
    }

    inline unsigned char RgbColor::B() const
      {
        return m_b;
      }

    inline void RgbColor::B(const unsigned char& b)
    {
      m_b = b;
    }
  }
}
#endif

./sth/util/RgbColor.h
#include "RgbColor.h"
namespace sth
{
  util::RgbColor::RgbColor(const unsigned char& r,
      const unsigned char& g,
      const unsigned char& b)
    : m_r(r)
    , m_g(g)
    , m_b(b)
  {}
  
  const util::RgbColor util::RgbColor::RED     = util::RgbColor(255,0,0);
  const util::RgbColor util::RgbColor::GREEN   = util::RgbColor(0,255,0);
  const util::RgbColor util::RgbColor::BLUE    = util::RgbColor(0,0,255);
  const util::RgbColor util::RgbColor::BLACK   = util::RgbColor(0,0,0);
  const util::RgbColor util::RgbColor::WHITE   =
util::RgbColor(255,255,255);
  const util::RgbColor util::RgbColor::MAGENTA = util::RgbColor(255,0,255);
  const util::RgbColor util::RgbColor::CYAN    = util::RgbColor(0,255,255);
  const util::RgbColor util::RgbColor::YELLOW  = util::RgbColor(255,255,0);

  /*!
    \fn util::RgbColor::print(std::ostream& out) const
  */
  std::ostream& util::RgbColor::print(std::ostream& out) const
  {
    out
      << "util::RgbColor::{r=" << this->m_r
      << ",g=" << this->m_g
      << ",b=" << this->m_b << "}\n";
    return out;
  }
  
}

./sth/util/Printable_IF.h
#ifndef PRINTABLE_IF_H
#define PRINTABLE_IF_H
#include <iostream>
namespace sth
  {
  namespace util
    {
    class Printable_IF
      {
      public:
        Printable_IF()
        {}
        virtual ~Printable_IF()
        {}

        virtual std::ostream& print(std::ostream& out) const = 0;
      };

    inline std::ostream& operator<<(std::ostream& out, const Printable_IF&
pif)
    {
      return pif.print(out);
    }
  }
}
#endif

undefined reference to `sth::util::RgbColor::RED'
./sth/libsth.a(ColorTest.o)(.text+0x6f):./sth/ColorTest.cpp:9: undefined
reference to `sth::util::RgbColor::RED'
./sth/libsth.a(ColorTest.o)(.text+0x77):./sth/ColorTest.cpp:9: undefined
reference to `sth::util::RgbColor::RED'
./sth/libsth.a(ColorTest.o)(.text+0x81):./sth/ColorTest.cpp:9: undefined
reference to `vtable for sth::util::RgbColor'
./sth/libsth.a(ColorTest.o)(.text+0x8f): In function
`sth::ColorTest::ColorTest[in-charge](std::basic_ostream<char,
std::char_traits<char> >&)':

-- 
.


reply via email to

[Prev in Thread] Current Thread [Next in Thread]