views:

309

answers:

4

Can anybody please help me to configure Visual Studio 2005 (if that's the solution to the problem). I'm using some external libs and I'm getting this error:

1>Compiling...
1>main.cpp
1>c:\documents and settings\mz07\desktop\project\vs8test1\vs8test1\main.cpp(99) : warning C4996: 'getch' was declared deprecated
1>        c:\program files\microsoft visual studio 8\vc\include\conio.h(145) : see declaration of 'getch'
1>        Message: 'The POSIX name for this item is deprecated. Instead, use the ISO C++ conformant name: _getch. See online help for details.'
1>c:\documents and settings\mz07\desktop\project\vs8test1\vs8test1\main.cpp(110) : warning C4996: 'getch' was declared deprecated
1>        c:\program files\microsoft visual studio 8\vc\include\conio.h(145) : see declaration of 'getch'
1>        Message: 'The POSIX name for this item is deprecated. Instead, use the ISO C++ conformant name: _getch. See online help for details.'
1>c:\documents and settings\mz07\desktop\project\vs8test1\vs8test1\main.cpp(128) : warning C4996: 'getch' was declared deprecated
1>        c:\program files\microsoft visual studio 8\vc\include\conio.h(145) : see declaration of 'getch'
1>        Message: 'The POSIX name for this item is deprecated. Instead, use the ISO C++ conformant name: _getch. See online help for details.'
1>Compiling manifest to resources...
1>Linking...
1>hdu.lib(hduError.obj) : error LNK2019: unresolved external symbol "__declspec(dllimport) class std::basic_ostream<char,struct std::char_traits<char> > & __cdecl std::operator<<(class std::basic_ostream<char,struct std::char_traits<char> > &,char const *)" (__imp_??6std@@YAAAV?$basic_ostream@DU?$char_traits@D@std@@@0@AAV10@PBD@Z) referenced in function "class std::basic_ostream<char,struct std::char_traits<char> > & __cdecl operator<<(class std::basic_ostream<char,struct std::char_traits<char> > &,struct HDErrorInfo const &)" (??6@YAAAV?$basic_ostream@DU?$char_traits@D@std@@@std@@AAV01@ABUHDErrorInfo@@@Z)
1>C:\Documents and Settings\mz07\Desktop\project\vs8Test1\Debug\vs8Test1.exe : fatal error LNK1120: 1 unresolved externals

I've been googling it for hours. PLEASE, stackoverflow is my last hope!

Sorry I forgot to include the code:

#include "atl/stdafx.h"
#include <cstdio>
#include <cassert>

#if defined(WIN32)
# include <conio.h>
#else
# include "conio.h"
#endif

#include <HD/hd.h>
#include <HDU/hduVector.h>
#include <HDU/hduError.h>

#pragma comment(lib, "hdu.lib")
#pragma comment(lib, "hlu.lib")
#pragma comment(lib, "hd.lib")
#pragma comment(lib, "hl.lib")

/*******************************************************************************
Haptic sphere callback.  
The sphere is oriented at 0,0,0 with radius 40, and provides a repelling force 
if the device attempts to penetrate through it. 
*******************************************************************************/

HDCallbackCode HDCALLBACK FrictionlessSphereCallback(void *data)
{
  const double sphereRadius = 40.0;
  const hduVector3Dd spherePosition(0,0,0);

// Stiffness, i.e. k value, of the sphere.  Higher stiffness results
// in a harder surface.
const double sphereStiffness = .25;

hdBeginFrame(hdGetCurrentDevice());

// Get the position of the device.
hduVector3Dd position;
hdGetDoublev(HD_CURRENT_POSITION, position);

// Find the distance between the device and the center of the
// sphere.
double distance = (position-spherePosition).magnitude();

// If the user is within the sphere -- i.e. if the distance from the user to 
// the center of the sphere is less than the sphere radius -- then the user 
// is penetrating the sphere and a force should be commanded to repel him 
// towards the surface.
if (distance < sphereRadius)
{
    // Calculate the penetration distance.
    double penetrationDistance = sphereRadius-distance;

    // Create a unit vector in the direction of the force, this will always 
    // be outward from the center of the sphere through the user's 
    // position.
    hduVector3Dd forceDirection = (position-spherePosition)/distance;

    // Use F=kx to create a force vector that is away from the center of 
    // the sphere and proportional to the penetration distance, and scsaled 
    // by the object stiffness.  
    // Hooke's law explicitly:
    double k = sphereStiffness;
    hduVector3Dd x = penetrationDistance*forceDirection;
    hduVector3Dd f = k*x;
    hdSetDoublev(HD_CURRENT_FORCE, f);
}

hdEndFrame(hdGetCurrentDevice());

HDErrorInfo error;
if (HD_DEVICE_ERROR(error = hdGetError()))
{
    hduPrintError(stderr, &error, "Error during main scheduler callback\n");

    if (hduIsSchedulerError(&error))
    {
        return HD_CALLBACK_DONE;
    }        
}

return HD_CALLBACK_CONTINUE;
}


/******************************************************************************
main function
Initializes the device, creates a callback to handle sphere forces, terminates
upon key press.
******************************************************************************/

int main(int argc, char* argv[])
{
HDErrorInfo error;
// Initialize the default haptic device.
HHD hHD = hdInitDevice(HD_DEFAULT_DEVICE);
if (HD_DEVICE_ERROR(error = hdGetError()))
{
    hduPrintError(stderr, &error, "Failed to initialize haptic device");
    fprintf(stderr, "\nPress any key to quit.\n");
    getch();
    return -1;
}

// Start the servo scheduler and enable forces.
hdEnable(HD_FORCE_OUTPUT);
hdStartScheduler();
if (HD_DEVICE_ERROR(error = hdGetError()))
{
    hduPrintError(stderr, &error, "Failed to start scheduler");
    fprintf(stderr, "\nPress any key to quit.\n");
    getch();
    return -1;
}

// Application loop - schedule our call to the main callback.
HDSchedulerHandle hSphereCallback = hdScheduleAsynchronous(
    FrictionlessSphereCallback, 0, HD_DEFAULT_SCHEDULER_PRIORITY);

printf("Sphere example.\n");
printf("Move the device around to feel a frictionless sphere\n\n");
printf("Press any key to quit.\n\n");

while (!_kbhit())
{
    if (!hdWaitForCompletion(hSphereCallback, HD_WAIT_CHECK_STATUS))
    {
        fprintf(stderr, "\nThe main scheduler callback has exited\n");
        fprintf(stderr, "\nPress any key to quit.\n");
        getch();
        break;
    }
}

// For cleanup, unschedule our callbacks and stop the servo loop.
hdStopScheduler();
hdUnschedule(hSphereCallback);
hdDisableDevice(hHD);

return 0;
}
A: 

Sorry I forgot to include the code:

#include "atl/stdafx.h"
#include <cstdio>
#include <cassert>

#if defined(WIN32)
# include <conio.h>
#else
# include "conio.h"
#endif

#include <HD/hd.h>
#include <HDU/hduVector.h>
#include <HDU/hduError.h>

#pragma comment(lib, "hdu.lib")
#pragma comment(lib, "hlu.lib")
#pragma comment(lib, "hd.lib")
#pragma comment(lib, "hl.lib")

/*******************************************************************************
Haptic sphere callback.  
The sphere is oriented at 0,0,0 with radius 40, and provides a repelling force 
if the device attempts to penetrate through it. 
*******************************************************************************/

HDCallbackCode HDCALLBACK FrictionlessSphereCallback(void *data)
{
  const double sphereRadius = 40.0;
  const hduVector3Dd spherePosition(0,0,0);

// Stiffness, i.e. k value, of the sphere.  Higher stiffness results
// in a harder surface.
const double sphereStiffness = .25;

hdBeginFrame(hdGetCurrentDevice());

// Get the position of the device.
hduVector3Dd position;
hdGetDoublev(HD_CURRENT_POSITION, position);

// Find the distance between the device and the center of the
// sphere.
double distance = (position-spherePosition).magnitude();

// If the user is within the sphere -- i.e. if the distance from the user to 
// the center of the sphere is less than the sphere radius -- then the user 
// is penetrating the sphere and a force should be commanded to repel him 
// towards the surface.
if (distance < sphereRadius)
{
    // Calculate the penetration distance.
    double penetrationDistance = sphereRadius-distance;

    // Create a unit vector in the direction of the force, this will always 
    // be outward from the center of the sphere through the user's 
    // position.
    hduVector3Dd forceDirection = (position-spherePosition)/distance;

    // Use F=kx to create a force vector that is away from the center of 
    // the sphere and proportional to the penetration distance, and scsaled 
    // by the object stiffness.  
    // Hooke's law explicitly:
    double k = sphereStiffness;
    hduVector3Dd x = penetrationDistance*forceDirection;
    hduVector3Dd f = k*x;
    hdSetDoublev(HD_CURRENT_FORCE, f);
}

hdEndFrame(hdGetCurrentDevice());

HDErrorInfo error;
if (HD_DEVICE_ERROR(error = hdGetError()))
{
    hduPrintError(stderr, &error, "Error during main scheduler callback\n");

    if (hduIsSchedulerError(&error))
    {
        return HD_CALLBACK_DONE;
    }        
}

return HD_CALLBACK_CONTINUE;
}


/******************************************************************************
main function
Initializes the device, creates a callback to handle sphere forces, terminates
upon key press.
******************************************************************************/

int main(int argc, char* argv[])
{
HDErrorInfo error;
// Initialize the default haptic device.
HHD hHD = hdInitDevice(HD_DEFAULT_DEVICE);
if (HD_DEVICE_ERROR(error = hdGetError()))
{
    hduPrintError(stderr, &error, "Failed to initialize haptic device");
    fprintf(stderr, "\nPress any key to quit.\n");
    getch();
    return -1;
}

// Start the servo scheduler and enable forces.
hdEnable(HD_FORCE_OUTPUT);
hdStartScheduler();
if (HD_DEVICE_ERROR(error = hdGetError()))
{
    hduPrintError(stderr, &error, "Failed to start scheduler");
    fprintf(stderr, "\nPress any key to quit.\n");
    getch();
    return -1;
}

// Application loop - schedule our call to the main callback.
HDSchedulerHandle hSphereCallback = hdScheduleAsynchronous(
    FrictionlessSphereCallback, 0, HD_DEFAULT_SCHEDULER_PRIORITY);

printf("Sphere example.\n");
printf("Move the device around to feel a frictionless sphere\n\n");
printf("Press any key to quit.\n\n");

while (!_kbhit())
{
    if (!hdWaitForCompletion(hSphereCallback, HD_WAIT_CHECK_STATUS))
    {
        fprintf(stderr, "\nThe main scheduler callback has exited\n");
        fprintf(stderr, "\nPress any key to quit.\n");
        getch();
        break;
    }
}

// For cleanup, unschedule our callbacks and stop the servo loop.
hdStopScheduler();
hdUnschedule(hSphereCallback);
hdDisableDevice(hHD);

return 0;
}
Student
You might want to delete this answer as I've edited your question to include the code.
Timo Geusch
+1  A: 

I think the library you're importing (hdu.lib) is built with a different runtime library - either you're mixing debug and release libraries here or static vs DLL runtimes.

Timo Geusch
I am new to c++ and visual studio. Do you mean I set wrong parameters to project configuration? Could you please point where exactly should I look at. Thanks a lot
Student
This is a very good point. Often people who distribute libraries prefer to link with the runtime statically, as it prevents them from having to distribute (and support) Microsoft DLLs.
T.E.D.
A: 

It looks to me like you aren't linking in the C++ library. If you right-click on your project's "properties", and check Configuration Properties -> Linker -> Input, does your "Additional Dependencies" line include "libcpmt.lib" ?

T.E.D.
No it doen't. I just tried to include it but it didn't work
Student
Same link error, or different ones?
T.E.D.
Exactly the same error
Student
A: 

It'd help if you could post the commandline switches the linker is running, by that I mean the full command.

It looks like this hdu libarary has a dependency on the C++ iostream library, can you check if your linker settings are specifying the iostream library.

toby
/OUT:"C:\Documents and Settings\mz07\Desktop\project\vs8Test1\Debug\vs8Test1.exe" /INCREMENTAL /NOLOGO /MANIFEST /MANIFESTFILE:"Debug\vs8Test1.exe.intermediate.manifest" /NODEFAULTLIB:"msvcrt.lib" /DEBUG /PDB:"c:\Documents and Settings\mz07\Desktop\project\vs8Test1\debug\vs8Test1.pdb" /SUBSYSTEM:CONSOLE /MACHINE:X86 /ERRORREPORT:PROMPT libcpmt.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib
Student
This entry: /NODEFAULTLIB:"msvcrt.lib" is a big warning flag for me - you're excluding the release C++ runtime inside a debug build, which suggests that you are mixing debug and release builds. This is generally not a good idea.
Timo Geusch