質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.50%

  • C++

    4437questions

    C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

  • Visual Studio

    2364questions

    Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

C++ Windowsアプリケーションにおけるextern "C"関連のエラー

解決済

回答 1

投稿

  • 評価
  • クリップ 0
  • VIEW 165

hsgru3

score 5

前提・実現したいこと

C++でIntel RealSense F200というwebカメラの映像を表示するwindowsフォームアプリケーションの作成

発生している問題・エラーメッセージ

LNK2028    未解決のトークン (0A0014DC) "extern "C" unsigned long __stdcall timeGetTime(void)" (?timeGetTime@@$$J10YGKXZ) が関数 "void __clrcall `dynamic initializer for 'lastTime''(void)" (???__ElastTime@@YMXXZ@?A0xabaf9275@@$$FYMXXZ) で参照されました。
LNK2019    未解決の外部シンボル "extern "C" unsigned long __stdcall timeGetTime(void)" (?timeGetTime@@$$J10YGKXZ) が関数 "void __clrcall `dynamic initializer for 'lastTime''(void)" (???__ElastTime@@YMXXZ@?A0xabaf9275@@$$FYMXXZ) で参照されました。
LNK2019    未解決の外部シンボル _Direct3DCreate9@4 が関数 "public: bool __thiscall UtilRenderD3D::RenderFrame(class Intel::RealSense::Image *)" (?RenderFrame@UtilRenderD3D@@QAE_NPAVImage@RealSense@Intel@@@Z) で参照されました。
LNK2019    未解決の外部シンボル _MFCopyImage@24 が関数 "public: bool __thiscall UtilRenderD3D::RenderFrame(class Intel::RealSense::Image *)" (?RenderFrame@UtilRenderD3D@@QAE_NPAVImage@RealSense@Intel@@@Z) で参照されました。
LNK1120    4 件の未解決の外部参照

該当のソースコード

#pragma once

#include <iostream>
#include <vector>
#include "string.h"
#include "opencv2\opencv.hpp"
#include "pxcsensemanager.h"
#include "PXCProjection.h"

PXCSenseManager *senseManager = 0;

//カラー画像
cv::Mat colorImage;

//座標変換インスタンス
PXCProjection *projection = nullptr;

//デプス画像の距離情報格納バッファ
std::vector<unsigned short> depthBuffer;

//カラー画像の幅、高さ、解像度
const int COLOR_WIDTH = 640;
const int COLOR_HEIGHT = 480;
const int COLOR_FPS = 30;

//デプス画像の幅、高さ、解像度
const int DEPTH_WIDTH = 640;
const int DEPTH_HEIGHT = 480;
const int DEPTH_FPS = 30;

namespace USPver3 {

    using namespace System;
    using namespace System::ComponentModel;
    using namespace System::Collections;
    using namespace System::Windows::Forms;
    using namespace System::Data;
    using namespace System::Drawing;

    /// <summary>
    /// USP の概要
    /// </summary>
    public ref class USP : public System::Windows::Forms::Form
    {
    public:
        USP(void)
        {
            InitializeComponent();
            //
            //TODO: ここにコンストラクター コードを追加します
            //
        }

    protected:
        /// <summary>
        /// 使用中のリソースをすべてクリーンアップします。
        /// </summary>
        ~USP()
        {
            if (components)
            {
                delete components;
            }
        }
    private: System::Windows::Forms::PictureBox^  pictureBox1;
    protected:

    private:
        /// <summary>
        /// 必要なデザイナー変数です。
        /// </summary>
        System::ComponentModel::Container ^components;

#pragma region Windows Form Designer generated code
        /// <summary>
        /// デザイナー サポートに必要なメソッドです。このメソッドの内容を
        /// コード エディターで変更しないでください。
        /// </summary>
        void InitializeComponent(void)
        {
            this->pictureBox1 = (gcnew System::Windows::Forms::PictureBox());
            (cli::safe_cast<System::ComponentModel::ISupportInitialize^>(this->pictureBox1))->BeginInit();
            this->SuspendLayout();
            // 
            // pictureBox1
            // 
            this->pictureBox1->Location = System::Drawing::Point(12, 12);
            this->pictureBox1->Name = L"pictureBox1";
            this->pictureBox1->Size = System::Drawing::Size(735, 416);
            this->pictureBox1->TabIndex = 0;
            this->pictureBox1->TabStop = false;
            // 
            // USP
            // 
            this->AutoScaleDimensions = System::Drawing::SizeF(6, 12);
            this->AutoScaleMode = System::Windows::Forms::AutoScaleMode::Font;
            this->ClientSize = System::Drawing::Size(759, 440);
            this->Controls->Add(this->pictureBox1);
            this->Name = L"USP";
            this->Text = L"USP";
            (cli::safe_cast<System::ComponentModel::ISupportInitialize^>(this->pictureBox1))->EndInit();
            this->ResumeLayout(false);

        }
#pragma endregion

        // 初期化
    private: System::Void USP_Load(System::Object^  sender, System::EventArgs^  e)
    {
        // SenseManagerを生成する
        senseManager = PXCSenseManager::CreateInstance();
        if (senseManager == 0) {
            throw std::runtime_error("SenseManagerの生成に失敗しました");
        }

        // カラーストリームを有効にする
        auto sts = senseManager->EnableStream(PXCCapture::StreamType::STREAM_TYPE_COLOR,
            COLOR_WIDTH, COLOR_HEIGHT, COLOR_FPS);
        if (sts < PXC_STATUS_NO_ERROR) {
            throw std::runtime_error("カラーストリームの有効化に失敗しました");
        }

        // Depthストリームを有効にする
        sts = senseManager->EnableStream(PXCCapture::StreamType::STREAM_TYPE_DEPTH,
            DEPTH_WIDTH, DEPTH_HEIGHT, DEPTH_FPS);
        if (sts < PXC_STATUS_NO_ERROR) {
            throw std::runtime_error("Depthストリームの有効化に失敗しました");
        }

        // パイプラインを初期化する
        sts = senseManager->Init();
        if (sts < PXC_STATUS_NO_ERROR) {
            throw std::runtime_error("パイプラインの初期化に失敗しました");
        }

        // デバイスを取得する
        auto device = senseManager->QueryCaptureManager()->QueryDevice();

        // 座標変換オブジェクトを作成
        projection = device->CreateProjection();

        // depthBufferの作成
        depthBuffer.resize(DEPTH_WIDTH * DEPTH_HEIGHT);

    }

        // フレームを更新する
    private: System::Void updateFrame()
    {
        // フレームを取得する
        pxcStatus sts = senseManager->AcquireFrame(false);
        if (sts < PXC_STATUS_NO_ERROR) {
            return;
        }

        // フレームデータを取得する
        const PXCCapture::Sample *sample = senseManager->QuerySample();
        if (sample) {
            // 各データを表示する
            updateColorImage(sample->color);
        }

        // フレームを解放する
        senseManager->ReleaseFrame();
        // カラー画像を更新する
    private: System::Void updateColorImage(PXCImage* colorFrame)
    {
        if (colorFrame == 0) {
            return;
        }

        // データを取得する
        PXCImage::ImageData data;
        pxcStatus sts = colorFrame->AcquireAccess(
            PXCImage::Access::ACCESS_READ,
            PXCImage::PixelFormat::PIXEL_FORMAT_RGB32, &data);
        if (sts < PXC_STATUS_NO_ERROR) {
            throw std::runtime_error("カラー画像の取得に失敗");
        }

        // データをコピーする
        PXCImage::ImageInfo info = colorFrame->QueryInfo();

        colorImage = cv::Mat(info.height, info.width, CV_8UC4);
        memcpy(colorImage.data, data.planes[0], data.pitches[0] * info.height);

        // データを解放する
        colorFrame->ReleaseAccess(&data);

        //描画
        drawImage(pictureBox1, colorImage);
    }

        //描画
    private: System::Void drawImage(PictureBox^ pic, cv::Mat mat) {
        if ((pic->Image == nullptr) || (pic->Width != mat.cols)
            || (pic->Height != mat.rows)) {
            pic->Width = mat.cols;
            pic->Height = mat.rows;
            Bitmap^ bmpPicBox = gcnew Bitmap(pic->Width, pic->Height);
            pic->Image = bmpPicBox;
        }
        Graphics^g = Graphics::FromImage(pic->Image);
        Bitmap^ bmp = gcnew Bitmap(mat.cols, mat.rows, mat.step,
            System::Drawing::Imaging::PixelFormat::Format32bppRgb, IntPtr(mat.data));
        g->DrawImage(bmp, 0, 0, mat.cols, mat.rows);
        pic->Refresh();
        delete g;
    }
    };
}

試したこと

opencv,realsensesdkのインクルードファイルやライブラリーの設定及び環境変数の追加など問題なくできています。
またコンソールアプリケーションでは同じような設定で動作が確認できました。

補足情報(FW/ツールのバージョンなど)

Visual Studio Community 2015
Windows 10
opencv 3.4.0

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

checkベストアンサー

0

winmm.libおよびd3d9.libEvr.libをリンカタブの追加のライブラリに追加してください

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/03/24 18:19

    回答ありがとうございます!
    教えていただいた通りwinmm.libおよびd3d9.lib・Evr.libを追加のライブラリに追加したところエラーの数は減りましたが以下のエラーが発生しました。
    、、、
    重大度レベル コード 説明 プロジェクト ファイル 行 抑制状態
    エラー LNK2019 未解決の外部シンボル _MFCopyImage@24 が関数 "public: bool __thiscall UtilRenderD3D::RenderFrame(class Intel::RealSense::Image *)" (?RenderFrame@UtilRenderD3D@@QAE_NPAVImage@RealSense@Intel@@@Z) で参照されました。 USPver3 C:\Users\aselab\Documents\Visual Studio 2015\Projects\USPver3\USPver3\libpxcutils_d.lib(util_render_D3D.obj) 1
    、、、
    何か解決策などあれば教えていただきたいです。

    キャンセル

  • 2019/03/24 19:23

    何度もすみません。
    libpxcutil_d.lib及びlibpxcutilsmd_d.libをプロジェクトのヘッダーファイルやcppファイルと同じところに置くとエラーがなくなりプログラムが実行されました。
    しかし、ウィンドウは表示されるもののpictureboxに映像が表示されないといった問題が起こっています。
    何か解決策などがありましたらおしえていただきたいです。
    よろしくお願いいたします。

    キャンセル

  • 2019/03/24 21:25

    んー
    よく分かりません。
    デバッガでブレーク挟んで想定通りに動いているのかを調べていくしかなさそうですね

    キャンセル

  • 2019/03/25 13:47

    返信ありがとうございます!
    とりあえずエラーはなくなったのでいろいろ試してみてわからなかったらまた別の質問として投稿しようと思います。

    キャンセル

同じタグがついた質問を見る

  • C++

    4437questions

    C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

  • Visual Studio

    2364questions

    Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。