Search code examples
visual-studio-2010buildstatic-linkingvtkpoint-cloud-library

Static build with PCL and OpenCV in Visual Studio 2010


I have a running project in Visual Studio 2010 using OpenCV 2.49 and Point Cloud Library 1.6 . I am trying to make a standalone executable so I don´t need to install OpenCV and PCL in other computers to make it run. OpenCV and PCL were installed using the precompiled binaries, and PCL also included boost (1.49) and vtk (5.8) libraries, among others.

For making the static build, I changed the Runtime Library in VS to /MT. Then, some Boost static libraries were missing, so I installed boost again (version 1.56, I believe I needed the libs with the 's').

Then I had errors like:

1>MSVCRT.lib(MSVCR100.dll) : error LNK2005: _malloc already defined in LIBCMT.lib(malloc.obj)

so I added msvcrt.lib, msvcprt.lib to the section "Ignore Specific Defaul Libraries".

Now I have errors like:

1>vtkCommon.lib(vtkVoidArray.obj) : error LNK2001: unresolved external symbol "__declspec(dllimport) public: class std::basic_ostream<char,struct std::char_traits<char> > & __thiscall std::basic_ostream<char,struct std::char_traits<char> >::operator<<(void const *)" (__imp_??6?$basic_ostream@DU?$char_traits@D@std@@@std@@QAEAAV01@PBX@Z)

1>vtkCommon.lib(vtkVariantArray.obj) : error LNK2001: unresolved external symbol "__declspec(dllimport) public: class std::basic_ostream<char,struct std::char_traits<char> > & __thiscall std::basic_ostream<char,struct std::char_traits<char> >::operator<<(void const *)" (__imp_??6?$basic_ostream@DU?$char_traits@D@std@@@std@@QAEAAV01@PBX@Z)

1>vtkCommon.lib(vtkTimerLog.obj) : error LNK2001: unresolved external symbol __imp__strncpy

1>vtkCommon.lib(vtkMath.obj) : error LNK2001: unresolved external symbol __imp__modf

1>vtksys.lib(SystemTools.obj) : error LNK2001: unresolved external symbol __imp___utime64

1>OLDNAMES.lib(unlink.obi) : error LNK2001: unresolved external symbol __imp__unlink

The vtk library is included exactly the same way as in the non-static release build. And, if I understood it correctly, .lib is an extension for a static libray.

What am I doing wrong?

EDIT: I tried using CMake, but I am getting the same kind of errors (There are a lot more):

2>vtksys.lib(SystemTools.obj) : error LNK2019: unresolved external symbol __imp___time64 referenced in function _time

2>vtkCommon.lib(vtkVariant.obj) : error LNK2019: unresolved external symbol "__declspec(dllimport) public: class std::basic_istream<char,struct std::char_traits<char> > & __thiscall std::basic_istream<char,struct std::char_traits<char> >::operator>>(short &)" (__imp_??5?$basic_istream@DU?$char_traits@D@std@@@std@@QAEAAV01@AAF@Z) referenced in function "short __cdecl vtkVariantStringToNumeric<short>(class vtkStdString,bool *,short *)" (??$vtkVariantStringToNumeric@F@@YAFVvtkStdString@@PA_NPAF@Z)

This is my CMakeList.txt:

cmake_minimum_required(VERSION 2.8 FATAL_ERROR)

project(3DVisualizerCM)

set(BUILD_SHARED_LIBS OFF)

SET(CMAKE_EXE_LINKER_FLAGS "/NODEFAULTLIB:msvcrt.lib
                            /NODEFAULTLIB:msvcprt.lib")

find_package(PCL 1.4 REQUIRED)
find_package(OpenCV REQUIRED)

include_directories(${PCL_INCLUDE_DIRS} )
link_directories(${PCL_LIBRARY_DIRS} )
add_definitions(${PCL_DEFINITIONS} )

add_executable (3D_v4 
        3D_v4.cpp
        C3DVisualizer.cpp
        C3DVisualizerMultiple.cpp
        C3DVisualizerSingle.cpp
        CCameraParameters.cpp
        CImageTrack.cpp
        CImg.cpp
        CImgMultiple.cpp
        CImgSingle.cpp
        helpers.cpp
)

target_link_libraries (3D_v4 ${PCL_LIBRARIES} ${OpenCV_LIBS})

Solution

  • The precompiled vtk libraries you are using from PCL must have been compiled using /MD flag (Multithreaded DLL) in Visual Studio. You need to recompile them using the /MT flag (Multithreaded static link).