[CMake] Beginner's Question: Organizing Projects

Aaron_Wright at selinc.com Aaron_Wright at selinc.com
Thu Oct 28 11:48:10 EDT 2010


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 <drescherjm at gmail.com>
To:
Dominik Gabi <dkgispam at gmail.com>
Cc:
cmake at cmake.org
Date:
10/28/2010 05:31 AM
Subject:
Re: [CMake] Beginner's Question: Organizing Projects
Sent by:
cmake-bounces at cmake.org



On Thu, Oct 28, 2010 at 8:29 AM, John Drescher <drescherjm at gmail.com> 
wrote:
> On Thu, Oct 28, 2010 at 8:23 AM, Dominik Gabi <dkgispam at 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 <eike at 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):
>>
>> dominik at 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




More information about the CMake mailing list