[CMake] Linking problem

Marcel Loose loose at astron.nl
Wed Jul 27 07:29:49 EDT 2011


On Wed, 2011-07-27 at 12:14 +0100, Sanatan Rai wrote:
> Hi,
>    This is a newbie question. So apologies in advance if this is
covered
> somewhere in the docs (I haven't been able to find a satisfactory
explanation).
> 
> The issue is this:
> 
> * I have a library called (lib)atmath as per:
> 
> include_directories(${at_SOURCE_DIR})
> add_library(atfwmath RngStream.cpp RngStream.h coin.cpp coin.hpp)
> target_link_libraries(atfwmath)
> 
> Where coin.hpp:
> 
> #ifndef COIN_HPP_INCLUDED
> #define COIN_HPP_INCLUDED
>
////////////////////////////////////////////////////////////////////////////////
> #include <sstream>
> #include <fw/math/RngStream.h>
> using namespace std;
>
////////////////////////////////////////////////////////////////////////////////
> class coin
> {
> private:
>   static string name()
>   {
>     static unsigned long id(0);
>     stringstream str;
>     str << "Coin_" << (++id) << "_stream";
>     return str.str();
>   }
>   double p;
>   RngStream *rng;
>   void init();
> public:
>   coin();
>   coin(double _p);
>   ~coin();
>   bool toss();
>   void reset(double _p);
> };
> #endif
> 
> and coin.cpp:
> 
> #include <fw/math/coin.hpp>
>
////////////////////////////////////////////////////////////////////////////////
> coin::coin() : p(0.5), rng(0) { init();}
> coin::coin(double _p) : p(_p), rng(0)
> {
>   if ((p < 0) || (p > 1))
>     throw;
>   init();
> }
> coin::~coin()
> {
>   delete rng, rng = 0;
> }
> void coin::init()
> {
>   rng = new RngStream(name().c_str());
> }
> bool coin::toss()
> {
>   double u(rng->RandU01());
>   return (u >= p);
> }
> void coin::reset(double _p)
> {
>   if ((_p < 0) || (_p > 1)) throw;
>   p = _p;
> }
> 
> 
> I use these classes in another library:
> 
> add_library(atidt STATIC idt.cpp)
> target_link_libraries(atidt atmath boost_date_time boost_signals)
> 
> 
> which is then linked to the final executable:
> add_executable(bt bt.cpp)
> target_link_libraries(bt atidt atmath boost_date_time
boost_program_options)
> target_link_libraries(bt "-Wl,-whole-archive -L../idt/ -latidt
> -Wl,-no-whole-archive")
> 
> When I run make:
> 
>    * libatmath compiles fine.
>    * libatidt complies fine.
>    * when compiling bt, it complains about coin::coin, coin::reset etc
> being undefined.
>      Ie it would see it is not finding them in the linked libraries.
> Even though:
> 
>      $ ar t libatmath.a
>       RngStream.cpp.o
>       coin.cpp.o
> 
> What am I missing here? It is also quite bizarre as it doesn't
> complain about the declarations in
> RngStream.h which are defined in RngStream.c.
> 
> Thanks in advance!
> 
> --Sanatan
> 
> 





More information about the CMake mailing list