[vtkusers] Linking static VTK to simple Qt app
Gib Bogle
g.bogle at auckland.ac.nz
Wed Sep 22 23:42:11 EDT 2010
Success!!!
I realized that I was able to build the app with cmake, since for some reason I
had a CMakeLists.txt and CMakeCache.txt that needed only minor tweaking (I wish
I remembered how I got them). I then copied the list of linked libraries off
the linking command that cmake spat out into QtCreator. It looks as if cmake
puts everything in there, for good luck, so I guess the list can be pared down a
bit. The main thing is it has the required order. Whew!
Thanks a million David and Andre. At last I can move ahead. I may even venture
into cmake territory. I'm impressed with how cleverly it put all the pieces
together with very little input from me.
best regards
Gib
David Gobbi wrote:
> Hi Gib,
>
> The link line is missing the VTK utility libraries. All of the needed
> libraries will be listed in the VTKLibraryDepends.cmake file in the
> VTK compile directory (though the file is written for CMake, so it
> isn't very easy to read...). You will definitely need this:
>
> -lvtksys
>
> and probably these:
>
> -lvtkfreetype -lvtkexpat -lvtkzlib
>
> and maybe these, plus others:
>
> -lvtkmetaio -lvtkpng -vtkjpeg -lvtktiff -lvtkexpat
>
> The compiler might also be picky about the order in which the
> libraries are listed on the command line.
>
> David
>
>
> On Wed, Sep 22, 2010 at 8:32 PM, Gib Bogle <g.bogle at auckland.ac.nz> wrote:
>> Hi,
>> Sorry to go on about this, but I am really stuck. On Windows, using
>> MinGW-4.4.0, I've built the VTK libraries statically, and the examples work.
>> Now I'm trying to use the static libraries with Qt, building with
>> QtCreator. I've now gone back to a very simple test program which works
>> with shared VTK libraries. On linking I get a very long list of "undefined
>> reference" errors, seemingly for a large fraction of the functions in the
>> libraries (see the end of this post for a sample). I was planning to just
>> post the link command:
>>
>> g++ -enable-stdcall-fixup -Wl,-enable-auto-import
>> -Wl,-enable-runtime-pseudo-reloc -Wl,-s -mthreads -Wl -Wl,-subsystem,windows
>> -o release\QVTK_test-static.exe release/mainwindow.o release/main.o
>> release/moc_mainwindow.o -L"c:\Qt\4.6.3\lib" -lmingw32 -lqtmain
>> -Lc:\VTK-build-4.4.0-static\bin -lQVTK -lvtkCommon -lvtkRendering
>> -lvtkGraphics -lvtkFiltering -lQtGui4 -lQtCore4
>>
>> then I decided I might as well post the source code as well, since it's so
>> short (see below). Maybe someone can see something obviously wrong with the
>> link command that qmake is generating.
>>
>> //----------------------------------------------------------------------
>> // mainwindow.h
>> #ifndef MAINWINDOW_H
>> #define MAINWINDOW_H
>>
>> #include <QMainWindow>
>> #include <QVTKWidget.h>
>> #include <vtkRenderer.h>
>> #include <vtkRenderWindow.h>
>> #include "vtkCylinderSource.h"
>> #include "vtkPolyDataMapper.h"
>> #include "vtkActor.h"
>> #include "vtkRenderWindowInteractor.h"
>> #include "vtkProperty.h"
>> #include "vtkCamera.h"
>>
>> QT_BEGIN_NAMESPACE
>> class QAction;
>> class QMenu;
>> class QMdiArea;
>> class QMdiSubWindow;
>> class QSignalMapper;
>> QT_END_NAMESPACE
>>
>> class MainWindow : public QMainWindow
>> {
>> Q_OBJECT
>>
>> public:
>> MainWindow();
>>
>> protected:
>> void closeEvent(QCloseEvent *event);
>> QMdiArea *mdiArea;
>> QWidget *myQwidget;
>> QVTKWidget* qvtkWidget;
>> vtkRenderer* ren;
>> FILE *fp;
>> };
>>
>> #endif
>>
>> //-------------------------------------------------------------------
>> // main.cpp
>> #include <QApplication>
>>
>> #include "mainwindow.h"
>>
>> int main(int argc, char *argv[])
>> {
>> QApplication app(argc, argv);
>> MainWindow mainWin;
>> mainWin.show();
>> QRect r = mainWin.geometry();
>> r.setWidth(800);
>> r.setHeight(600);
>> mainWin.setGeometry(r);
>> r = mainWin.geometry();
>> return app.exec();
>> }
>>
>> //--------------------------------------------------------------------
>> // mainwindow.cpp
>> #include <QtGui>
>>
>> #include "mainwindow.h"
>>
>> MainWindow::MainWindow()
>> {
>> mdiArea = new QMdiArea;
>> mdiArea->setHorizontalScrollBarPolicy(Qt::ScrollBarAsNeeded);
>> mdiArea->setVerticalScrollBarPolicy(Qt::ScrollBarAsNeeded);
>> setCentralWidget(mdiArea);
>>
>> setWindowTitle(tr("MDI"));
>> setUnifiedTitleAndToolBarOnMac(true);
>>
>> QRect r = mdiArea->geometry();
>> r.setWidth(400);
>> r.setHeight(300);
>> mdiArea->setGeometry(r);
>>
>>
>> // Create a QVTKWidget, and a layout, and add the widget to the
>> layout
>> qvtkWidget = new QVTKWidget(this,QFlag(0));
>> QVBoxLayout *layout = new QVBoxLayout;
>> layout->addWidget(qvtkWidget);
>>
>> // Associate the layout with mdiArea
>> mdiArea->setLayout(layout);
>>
>> // Create a renderer, and add it to qvtkWidget's render window.
>> // The renderer renders into the render window.
>> ren = vtkRenderer::New();
>> vtkRenderWindow *renWin = qvtkWidget->GetRenderWindow();
>> renWin->AddRenderer(ren);
>>
>> vtkCylinderSource *cylinder = vtkCylinderSource::New();
>> cylinder->SetResolution(18);
>>
>> vtkPolyDataMapper *cylinderMapper = vtkPolyDataMapper::New();
>> cylinderMapper->SetInputConnection(cylinder->GetOutputPort());
>>
>> vtkActor *cylinderActor1 = vtkActor::New();
>> cylinderActor1->SetMapper(cylinderMapper);
>> cylinderActor1->GetProperty()->SetColor(1.0000, 0.3882, 0.2784);
>> cylinderActor1->RotateX(30.0);
>> cylinderActor1->RotateZ(-45.0);
>> vtkActor *cylinderActor2 = vtkActor::New();
>> cylinderActor2->SetMapper(cylinderMapper);
>> cylinderActor2->GetProperty()->SetColor(0.2, 0.6, 0.4);
>>
>> // Position the actors
>> int x, y, z;
>> x = 0;
>> y = 0;
>> z = 0;
>> cylinderActor1->SetPosition(x, y, z);
>> x = 5;
>> y = 2;
>> z = 5;
>> cylinderActor2->SetPosition(x, y, z);
>>
>> ren->AddActor(cylinderActor1);
>> ren->AddActor(cylinderActor2);
>> ren->SetBackground(0.1, 0.2, 0.4);
>>
>> ren->ResetCamera();
>> ren->GetActiveCamera()->Zoom(1.5);
>>
>> vtkRenderWindowInteractor *iren = qvtkWidget->GetInteractor();
>> iren->Initialize();
>> }
>>
>> void MainWindow::closeEvent(QCloseEvent *event)
>> {
>> event->accept();
>> }
>>
>> //----------------------------------------------------------------------
>> Sample of link errors:
>>
>> c:\VTK-build-4.4.0-static\bin/libvtkCommon.a(vtkObjectFactory.cxx.obj):vtkObjectFactory.cxx:(.text+0x109c):
>> undefined reference to `vtksys::Directory::Directory()'
>>
>> c:\VTK-build-4.4.0-static\bin/libvtkCommon.a(vtkObjectFactory.cxx.obj):vtkObjectFactory.cxx:(.text+0x10ae):
>> undefined reference to `vtksys::Directory::Load(char const*)'
>>
>> c:\VTK-build-4.4.0-static\bin/libvtkCommon.a(vtkObjectFactory.cxx.obj):vtkObjectFactory.cxx:(.text+0x10cb):
>> undefined reference to `vtksys::Directory::GetNumberOfFiles() const'
>>
>> c:\VTK-build-4.4.0-static\bin/libvtkCommon.a(vtkObjectFactory.cxx.obj):vtkObjectFactory.cxx:(.text+0x10e6):
>> undefined reference to `vtksys::Directory::GetFile(unsigned long) const'
>>
>> c:\VTK-build-4.4.0-static\bin/libvtkCommon.a(vtkObjectFactory.cxx.obj):vtkObjectFactory.cxx:(.text+0x14fe):
>> undefined reference to `vtksys::Directory::~Directory()'
>>
>> c:\VTK-build-4.4.0-static\bin/libvtkCommon.a(vtkObjectFactory.cxx.obj):vtkObjectFactory.cxx:(.text+0x1511):
>> undefined reference to `vtksys::Directory::~Directory()'
>>
>> c:\VTK-build-4.4.0-static\bin/libvtkCommon.a(vtkObjectFactory.cxx.obj):vtkObjectFactory.cxx:(.text+0x1520):
>> undefined reference to `vtksys::Directory::~Directory()'
>>
>> c:\VTK-build-4.4.0-static\bin/libvtkCommon.a(vtkWin32OutputWindow.cxx.obj):vtkWin32OutputWindow.cxx:(.text+0x2dd):
>> undefined reference to `GetStockObject at 4'
>>
>> c:\VTK-build-4.4.0-static\bin/libvtkCommon.a(vtkVariant.cxx.obj):vtkVariant.cxx:(.text+0x52e):
>> undefined reference to `vtksys::SystemToolsManager::SystemToolsManager()'
>>
>> c:\VTK-build-4.4.0-static\bin/libvtkCommon.a(vtkVariant.cxx.obj):vtkVariant.cxx:(.text+0x54e):
>> undefined reference to `vtksys::SystemToolsManager::~SystemToolsManager()'
>>
>> c:\VTK-build-4.4.0-static\bin/libvtkCommon.a(vtkVariant.cxx.obj):vtkVariant.cxx:(.text+0x704):
>> undefined reference to `vtksys::SystemTools::Strucmp(char const*, char
>> const*)'
>>
>> c:\VTK-build-4.4.0-static\bin/libvtkCommon.a(vtkVariant.cxx.obj):vtkVariant.cxx:(.text+0x72e):
>> undefined reference to `vtksys::SystemTools::Strucmp(char const*, char
>> const*)'
>>
>> c:\VTK-build-4.4.0-static\bin/libvtkCommon.a(vtkVariant.cxx.obj):vtkVariant.cxx:(.text+0x756):
>> undefined reference to `vtksys::SystemTools::Strucmp(char const*, char
>> const*)'
>>
>> c:\VTK-build-4.4.0-static\bin/libvtkCommon.a(vtkVariant.cxx.obj):vtkVariant.cxx:(.text+0x76c):
>> undefined reference to `vtksys::SystemTools::Strucmp(char const*, char
>> const*)'
>>
>> c:\VTK-build-4.4.0-static\bin/libvtkCommon.a(vtkVariant.cxx.obj):vtkVariant.cxx:(.text+0x796):
>> undefined reference to `vtksys::SystemTools::Strucmp(char const*, char
>> const*)'
>>
>> c:\VTK-build-4.4.0-static\bin/libvtkCommon.a(vtkDynamicLoader.cxx.obj):vtkDynamicLoader.cxx:(.text+0x68):
>> undefined reference to `vtksys::DynamicLoader::LastError()'
>>
>> c:\VTK-build-4.4.0-static\bin/libvtkCommon.a(vtkDynamicLoader.cxx.obj):vtkDynamicLoader.cxx:(.text+0x74):
>> undefined reference to `vtksys::DynamicLoader::LibExtension()'
>>
>> c:\VTK-build-4.4.0-static\bin/libvtkCommon.a(vtkDynamicLoader.cxx.obj):vtkDynamicLoader.cxx:(.text+0x80):
>> undefined reference to `vtksys::DynamicLoader::LibPrefix()'
>>
>> c:\VTK-build-4.4.0-static\bin/libvtkCommon.a(vtkDynamicLoader.cxx.obj):vtkDynamicLoader.cxx:(.text+0x8c):
>> undefined reference to
>> `vtksys::DynamicLoader::GetSymbolAddress(HINSTANCE__*, char const*)'
>>
>> c:\VTK-build-4.4.0-static\bin/libvtkCommon.a(vtkDynamicLoader.cxx.obj):vtkDynamicLoader.cxx:(.text+0x98):
>> undefined reference to `vtksys::DynamicLoader::CloseLibrary(HINSTANCE__*)'
>>
>> c:\VTK-build-4.4.0-static\bin/libvtkCommon.a(vtkDynamicLoader.cxx.obj):vtkDynamicLoader.cxx:(.text+0xa4):
>> undefined reference to `vtksys::DynamicLoader::OpenLibrary(char const*)'
>>
>> c:\VTK-build-4.4.0-static\bin/libvtkRendering.a(vtkRenderer.cxx.obj):vtkRenderer.cxx:(.text+0xfa6):
>> undefined reference to `vtkAssemblyPath::GetLastNode()'
>>
>> c:\VTK-build-4.4.0-static\bin/libvtkRendering.a(vtkRenderer.cxx.obj):vtkRenderer.cxx:(.text+0xfc4):
>> undefined reference to `vtkAssemblyPath::GetLastNode()'
>>
>> c:\VTK-build-4.4.0-static\bin/libvtkRendering.a(vtkRenderer.cxx.obj):vtkRenderer.cxx:(.text+0x104e):
>> undefined reference to `vtkAssemblyPath::GetLastNode()'
>>
>> c:\VTK-build-4.4.0-static\bin/libvtkRendering.a(vtkRenderer.cxx.obj):vtkRenderer.cxx:(.text+0x106c):
>> undefined reference to `vtkAssemblyPath::GetLastNode()'
>>
>> c:\VTK-build-4.4.0-static\bin/libvtkRendering.a(vtkRenderer.cxx.obj):vtkRenderer.cxx:(.text+0x10f6):
>> undefined reference to `vtkAssemblyPath::GetLastNode()'
>>
>> c:\VTK-build-4.4.0-static\bin/libvtkRendering.a(vtkRenderer.cxx.obj):vtkRenderer.cxx:(.text+0x1114):
>> more undefined references to `vtkAssemblyPath::GetLastNode()' follow
>>
>> c:\VTK-build-4.4.0-static\bin/libvtkRendering.a(vtkRenderer.cxx.obj):vtkRenderer.cxx:(.text+0x1734):
>> undefined reference to `vtkPropCollection::New()'
>>
>> c:\VTK-build-4.4.0-static\bin/libvtkRendering.a(vtkRenderer.cxx.obj):vtkRenderer.cxx:(.text+0x1b84):
>> undefined reference to `vtkPropCollection::GetNumberOfPaths()'
>>
>> c:\VTK-build-4.4.0-static\bin/libvtkRendering.a(vtkRenderer.cxx.obj):vtkRenderer.cxx:(.text+0x1c45):
>> undefined reference to `vtkPropCollection::New()'
>>
>> c:\VTK-build-4.4.0-static\bin/libvtkRendering.a(vtkRenderer.cxx.obj):vtkRenderer.cxx:(.text+0x1ca1):
>> undefined reference to `vtkAssemblyPath::GetLastNode()'
>>
>> c:\VTK-build-4.4.0-static\bin/libvtkRendering.a(vtkRenderer.cxx.obj):vtkRenderer.cxx:(.text+0x1ffc):
>> undefined reference to `vtkMatrix4x4::New()'
>>
>> c:\VTK-build-4.4.0-static\bin/libvtkRendering.a(vtkRenderer.cxx.obj):vtkRenderer.cxx:(.text+0x2059):
>> undefined reference to `vtkMatrix4x4::DeepCopy(double*, double const*)'
>>
>> c:\VTK-build-4.4.0-static\bin/libvtkRendering.a(vtkRenderer.cxx.obj):vtkRenderer.cxx:(.text+0x30cc):
>> undefined reference to `vtkMatrix4x4::New()'
>>
>>
>> ----------------------------------------------------------------
>> This message was sent using IMP, the Internet Messaging Program.
>>
>> _______________________________________________
>> 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 VTK FAQ at:
>> http://www.vtk.org/Wiki/VTK_FAQ
>>
>> Follow this link to subscribe/unsubscribe:
>> http://www.vtk.org/mailman/listinfo/vtkusers
>>
More information about the vtkusers
mailing list