I've seen this a few times in the past, and I've seen a few people try to get it to work. My advise is to not try. The problem comes from thinking that a template class is a class, but that is not true. Your template class is just a recipe for the compiler to use when it wants to make a class for you on the fly at compile time. The compiler needs the entire recipe to do this. Thus, splitting up the recipe (template) between a header and a cpp file confuses the compiler.
Do yourself a favor and just put template classes in headers. --- Aaron Wright From: John Drescher <dresche...@gmail.com> To: Dominik Gabi <dkgis...@gmail.com> Cc: cmake@cmake.org Date: 10/28/2010 05:31 AM Subject: Re: [CMake] Beginner's Question: Organizing Projects Sent by: cmake-boun...@cmake.org On Thu, Oct 28, 2010 at 8:29 AM, John Drescher <dresche...@gmail.com> wrote: > On Thu, Oct 28, 2010 at 8:23 AM, Dominik Gabi <dkgis...@gmail.com> wrote: >> On Wed, 2010-10-27 at 10:54 -0500, Ryan Pavlik wrote: >>> On Wed, Oct 27, 2010 at 9:04 AM, Rolf Eike Beer <e...@sf-mail.de> wrote: >>> >> Thanks. The way I understand this is that now instead of >>> >> >>> >> include_directories(${GTKMM_INCLUDE_DIRS}) >>> >> >>> >> i would write something like >>> >> >>> >> include_directories(${GTKMM_INCLUDE_DIRS}) >>> >> # and at the end of the file >>> >> set(INCLUDE_DIRECTORIES ${INCLUDE_DIRECTORIES} PARENT_SCOPE) >>> >> >>> >> ? I'd do the same with the LINK_DIRECTORIES, LINK_LIBRARIES property and >>> >> for all other libraries? >>> > >>> > Don't set LINK_DIRECTORIES and LINK_LIBRARIES. When you are a beginner >>> > probably every usage of them is wrong. >>> > >>> > You simply do >>> > >>> > TARGET_LINK_LIBRARIES(mytarget ${GTK_LIBRARIES}) (or however that is called) >>> > >>> > The only thing you need to "export upwards" in this case would be the >>> > GTK_LIBRARIES variable. >>> > >>> > Eike >>> >>> This is good advice, however, in most cases, since you're using >>> pkgconfig directly (which is not the recommended way), that will cause >>> more failure. Best thing to do is to create/find a cmake module for >>> each of those packages, that might use pkgconfig for help finding the >>> library, but that doesn't just use what it returns verbatim. >>> >>> Ryan >>> >> >> As it turns out, my problems are probably not cmake related. Thanks for >> the help anyway. >> >> Maybe it's my limited understanding of C++. So here's the problem. The >> project structure is as before. I've got a ui directory that uses >> classes from the geometry directory. I've set up a simple test class in >> the geometry directory that I use in some file in ui. >> >> // Test.h >> class Test >> { >> public: >> static void test(); >> }; >> >> // Test.cpp >> #include "Test.h" >> #include <iostream> >> void Test::test() >> { >> std::cout << "Hello World!" << std::endl; >> } >> >> With these two files it works perfectly fine. Everything compiles, links >> and runs without problems. Unfortunately, as soon as I add templates the >> situation is different: >> >> // Test.h >> template<class T> >> class Test >> { >> public: >> static void test(); >> }; >> >> // Test.cpp >> #include "Test.h" >> #include <iostream> >> template<class T> >> void Test<T>::test() >> { >> std::cout << "Hello World!" << std::endl; >> } >> >> results in the following error (I've left out the name spaces above for >> clarity): >> >> domi...@dmac:Pixels$ make >> Scanning dependencies of target Ui >> [ 33%] Building CXX object ui/CMakeFiles/Ui.dir/MainWindow.cpp.o >> Linking CXX static library libUi.a >> [ 33%] Built target Ui >> [ 66%] Built target Geometry >> Linking CXX executable Pixels >> ui/libUi.a(MainWindow.cpp.o): In function >> `UI::MainWindow::start_application(int, char**)': >> MainWindow.cpp:(.text+0x9e1): undefined reference to >> `GE::Test<double>::test()' >> collect2: ld returned 1 exit status >> make[2]: *** [Pixels] Error 1 >> make[1]: *** [CMakeFiles/Pixels.dir/all] Error 2 >> make: *** [all] Error 2 >> >> I don't get it, can anyone explain this to me? >> > > Start reading here: > > http://stackoverflow.com/questions/115703/storing-c-template-function-definitions-in-a-cpp-file > > John > Here is a second link: http://www.parashift.com/c++-faq-lite/templates.html#faq-35.12 -- John M. Drescher _______________________________________________ Powered by www.kitware.com Visit other Kitware open-source projects at http://www.kitware.com/opensource/opensource.html Please keep messages on-topic and check the CMake FAQ at: http://www.cmake.org/Wiki/CMake_FAQ Follow this link to subscribe/unsubscribe: http://www.cmake.org/mailman/listinfo/cmake _______________________________________________ Powered by www.kitware.com Visit other Kitware open-source projects at http://www.kitware.com/opensource/opensource.html Please keep messages on-topic and check the CMake FAQ at: http://www.cmake.org/Wiki/CMake_FAQ Follow this link to subscribe/unsubscribe: http://www.cmake.org/mailman/listinfo/cmake