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

Posted

技术标签:

【中文标题】Qt 5.5.1 MSVC 2013,32 位 - LNK1181:无法打开输入文件 \'NIDAQmx.lib\'【英文标题】:Qt 5.5.1 MSVC 2013, 32 bit - LNK1181: cannot open input file 'NIDAQmx.lib'Qt 5.5.1 MSVC 2013,32 位 - LNK1181:无法打开输入文件 'NIDAQmx.lib' 【发布时间】:2015-11-25 13:33:34 【问题描述】:

我正在使用 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 += "$absolute path\NIDAQmx.lib" ' 添加路径,但无济于事。

下面是 main.c++ 文件中的示例代码。我从原始 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;

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

这似乎很愚蠢。我最近几天一直在这。

希望早日解决。

谢谢

【问题讨论】:

我看到您在标题中提到了 32 位,但我并不完全清楚您是否正在构建 32 位应用程序。您正在构建 32 位应用程序吗?如果不是,我认为问题不在于 windows 找不到库,而是它找到的库是错误的位级别。 是的,我正在构建一个 32 位应用程序,并且我选择了 National Instruments 提供的 32 位版本的库。我尝试了其他版本,但无济于事,所以我在这里用有意义的方式提问。我在 64 位 Win 10 上,使用套件“Desktop Qt 5.5.1 MSVC2013 32 位”,自动检测 32 位 msvc 编译器,用于编译 32 位。另外,我正在发布模式下构建,以避免库名称等其他问题。 【参考方案1】:

所以我终于突破了。以下内容编译无误。

我所做的是为“Desktop Qt 5.5.1 MSVC2013 32bit”套件创建了一个新的控制台应用程序。然后我将头文件和lib文件放在项目文件夹中。 我修改了在“新项目”上创建的 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 应用程序,因为我没有执行最后两行代码。这是有道理的。

【讨论】:

以上是关于Qt 5.5.1 MSVC 2013,32 位 - LNK1181:无法打开输入文件 'NIDAQmx.lib'的主要内容,如果未能解决你的问题,请参考以下文章

PCL 1.6.0 和 Qt 5.5.0

Qt 5.7 版本+2013VS环境配置

VS2017 的 QT 32 位

Qt Designer插件安装问题

QT环境安装VS2013(系统环境里设置QTDIR,并添加VS2013的BIN目录)

qwt 无法构建 Windows 8 64 位