C ++链接错误LNK2019

时间:2010-01-21 13:21:56

标签: c++ visual-studio-2005 linker

任何人都可以帮我配置Visual Studio 2005(如果这是解决问题的方法)。我正在使用一些外部库,我收到了这个错误:

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

我一直在Google上搜索数小时。请知,stackoverflow是我最后的希望!

抱歉,我忘了提供代码:

#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;
}

3 个答案:

答案 0 :(得分:2)

我认为您导入的库(hdu.lib)是使用不同的运行时库构建的 - 要么是在这里混合调试版本,要么是静态版本与DLL运行时混合。

答案 1 :(得分:0)

在我看来,你并没有在C ++库中链接。如果右键单击项目的“属性”,并选中配置属性 - &gt;链接器 - &gt;输入,你的“附加依赖”行是否包含“libcpmt.lib”?

答案 2 :(得分:0)

如果您可以发布链接器正在运行的命令行开关,那将是有帮助的,我的意思是完整的命令。

看起来这个hdu libarary依赖于C ++ iostream库,可以检查链接器设置是否指定了iostream库。