0

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/.

したがって、最後の 3 つのコマンドは、プロジェクト名を右クリックして [ライブラリの追加...] を選択してウィザードでライブラリを追加したときに、QtCreator 自体によって追加されました。また、「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;
}

したがって、他の方法では機能しなかったため、絶対参照を含むヘッダー ファイルをインクルードしていることがわかります。

それはばかげているようです。私はここ数日これに取り組んでいます。

早く解決することを願っています。

ありがとうございました

4

1 に答える 1

0

というわけで、やっと突破。以下はエラーなしでコンパイルされたものです。

私がしたことは、'Desktop Qt 5.5.1 MSVC2013 32bit' キット用の新しいコンソール アプリケーションを作成したことです。次に、ヘッダーと lib ファイルをプロジェクト フォルダーに配置しました。"New Project" で作成した main.cpp を変更してヘッダー ファイルをインクルードし、lib ファイルとヘッダーも .pro にインクルードしました。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();
}

したがって、最後の 2 行のコードを実行しなかったために、適切な Qt アプリケーションが実行されていなかったと思います。意味あり。

于 2015-11-25T21:18:54.533 に答える