Qt 5.5.1 MSVC 2013,32位 - LNK1181:无法打开输入文件' NIDAQmx.lib'

时间:2015-11-25 13:33:34

标签: c++ qt visual-c++ nidaqmx

我使用Qt creator 3.5.1尝试编译来自National Instruments DAQmx示例的c代码。

要做到这一点,我需要包含一个头文件" NIDAQmx.h"并链接库文件" NIDAQmx.lib"。这两个文件都存在于项目文件夹中。

当我尝试使用msvc 2013进行编译时,我收到错误:

  

LNK1181:无法打开输入文件' NIDAQmx.lib'

在互联网上搜索我发现这是一个常见问题,并且错误代码为“LNK1181'意味着编译器无法找到库。但所有提出的案例都非常具体,我无法找到解决这个问题的原因。

这是我的.pro文件:

QT += core
QT -= gui

TARGET = Test4NI
CONFIG += console
CONFIG -= app_bundle

TEMPLATE = app

SOURCES += \
    main.cpp


win32: LIBS += -L$$PWD/./ -lNIDAQmx

INCLUDEPATH += $$PWD/.
DEPENDPATH += $$PWD/.

因此,当我通过右键单击项目名称并选择“添加库...”来向向导添加库时,QtCreator自己添加了最后3个命令。 我还尝试添加' INCLUDEPATH + =" $ absolute path" '和' LIB + =" $绝对路径\ NIDAQmx.lib" ',但无济于事。

以下是main.c ++文件中的示例代码。我从orignal c示例中获取了代码并将其粘贴在' main.c ++'上。我不相信这是问题的根源,因为它是关于库包含的错误。

#include <stdio.h>
#include "C:\BK\This\WorkEn\Qt\Test4\Test4NI\NIDAQmx.h"

#define DAQmxErrChk(functionCall) if( DAQmxFailed(error=(functionCall)) ) goto Error; else

int main(void)
{
    int32       error=0;
    TaskHandle  taskHandle=0;
    int32       read;
    float64     data[1000];
    char        errBuff[2048]={'\0'};

    /*********************************************/
    // DAQmx Configure Code
    /*********************************************/
    DAQmxErrChk (DAQmxCreateTask("",&taskHandle));
    DAQmxErrChk (DAQmxCreateAIVoltageChan(taskHandle,"Dev1/ai0","",DAQmx_Val_Cfg_Default,-10.0,10.0,DAQmx_Val_Volts,NULL));
    DAQmxErrChk (DAQmxCfgSampClkTiming(taskHandle,"",10000.0,DAQmx_Val_Rising,DAQmx_Val_FiniteSamps,1000));

    /*********************************************/
    // DAQmx Start Code
    /*********************************************/
    DAQmxErrChk (DAQmxStartTask(taskHandle));

    /*********************************************/
    // DAQmx Read Code
    /*********************************************/
    DAQmxErrChk (DAQmxReadAnalogF64(taskHandle,1000,10.0,DAQmx_Val_GroupByChannel,data,1000,&read,NULL));

    printf("Acquired %d points\n",(int)read);

Error:
    if( DAQmxFailed(error) )
        DAQmxGetExtendedErrorInfo(errBuff,2048);
    if( taskHandle!=0 )  {
        /*********************************************/
        // DAQmx Stop Code
        /*********************************************/
        DAQmxStopTask(taskHandle);
        DAQmxClearTask(taskHandle);
    }
    if( DAQmxFailed(error) )
        printf("DAQmx Error: %s\n",errBuff);
    printf("End of program, press Enter key to quit\n");
    getchar();
    return 0;
}

所以你可以看到我用绝对引用包含头文件,因为它没有以任何其他方式工作。

看起来好像很傻。我已经在这最后几天了。

我希望很快就能解决。

谢谢

1 个答案:

答案 0 :(得分:0)

所以我终于突破了。编译后无错误。

我所做的是为桌面Qt 5.5.1创建了一个新的控制台应用程序MSVC2013 32位&#39;套件。然后我将header和lib文件放在项目文件夹中。 我修改了在&#34; New Project&#34;上创建的main.cpp。包含头文件,还包括.pro中的lib文件和头文件。在main.cpp中,我只复制了与我试图编译的NI示例相关的代码行。

您可以检查两个项目之间的差异,将上述问题与下面的工作代码进行比较。主程序是相同的,但主要功能是c ++,并执行QCoreApplication。

所以,这里是.pro文件:

QT += core
QT -= gui

TARGET = Test5NI
CONFIG += console
CONFIG -= app_bundle

TEMPLATE = app

HEADERS += "C:\BK\This\WorkEn\Qt\Test5\Test5NI\NIDAQmx.h"
LIBS += "C:\BK\This\WorkEn\Qt\Test5\Test5NI\NIDAQmx.lib"

SOURCES += main.cpp

这里是main.cpp:

#include <QCoreApplication>
#include <C:\BK\This\WorkEn\Qt\Test5\Test5NI\NIDAQmx.h>

#define DAQmxErrChk(functionCall) if( DAQmxFailed(error=(functionCall)) ) goto Error; else

int main(int argc, char *argv[]){
    int32       error=0;
    TaskHandle  taskHandle=0;
    int32       read;
    float64     data[1000];
    char        errBuff[2048]={'\0'};

    /*********************************************/
    // DAQmx Configure Code
    /*********************************************/
    DAQmxErrChk (DAQmxCreateTask("",&taskHandle));
    DAQmxErrChk (DAQmxCreateAIVoltageChan(taskHandle,"Dev1/ai0","",DAQmx_Val_Cfg_Default,-10.0,10.0,DAQmx_Val_Volts,NULL));
    DAQmxErrChk (DAQmxCfgSampClkTiming(taskHandle,"",10000.0,DAQmx_Val_Rising,DAQmx_Val_FiniteSamps,1000));

    /*********************************************/
    // DAQmx Start Code
    /*********************************************/
    DAQmxErrChk (DAQmxStartTask(taskHandle));

    /*********************************************/
    // DAQmx Read Code
    /*********************************************/
    DAQmxErrChk (DAQmxReadAnalogF64(taskHandle,1000,10.0,DAQmx_Val_GroupByChannel,data,1000,&read,NULL));

    printf("Acquired %d points\n",(int)read);

Error:
    if( DAQmxFailed(error) )
        DAQmxGetExtendedErrorInfo(errBuff,2048);
    if( taskHandle!=0 )  {
        /*********************************************/
        // DAQmx Stop Code
        /*********************************************/
        DAQmxStopTask(taskHandle);
        DAQmxClearTask(taskHandle);
    }
    if( DAQmxFailed(error) )
        printf("DAQmx Error: %s\n",errBuff);
    printf("End of program, press Enter key to quit\n");
    getchar();

    QCoreApplication a(argc, argv);
    return a.exec();
}

所以我想我没有通过不执行最后两行代码来运行正确的Qt应用程序。这是有道理的。