open62541のサンプルを動かす

前回の記事でopen62541のビルドに成功して、 open62541.lib が生成できるのは確認できた。 けど、これができたからといって実際には使えないので、このライブラリを使ってexeを作る必要がある。

んで、githubのページのREADMEにはサンプルが示してあって、今回はそれを動かしてみる。

https://github.com/open62541/open62541/tree/v1.1-dev#examples

#include <stdio.h>
#include <open62541/client.h>
#include <open62541/client_config_default.h>
#include <open62541/client_highlevel.h>

int main(int argc, char* argv[])
{
    /* Create a client and connect */
    UA_Client* client = UA_Client_new();
    UA_ClientConfig_setDefault(UA_Client_getConfig(client));
    UA_StatusCode status = UA_Client_connect(client, "opc.tcp://localhost:4840");
    if (status != UA_STATUSCODE_GOOD) {
        UA_Client_delete(client);
        return status;
    }

    /* Read the value attribute of the node. UA_Client_readValueAttribute is a
    * wrapper for the raw read service available as UA_Client_Service_read. */
    UA_Variant value; /* Variants can hold scalar values and arrays of any type */
    UA_Variant_init(&value);
    status = UA_Client_readValueAttribute(client, UA_NODEID_STRING(1, "the.answer"), &value);
    if (status == UA_STATUSCODE_GOOD &&
        UA_Variant_hasScalarType(&value, &UA_TYPES[UA_TYPES_INT32])) {
        printf("the value is: %i\n", *(UA_Int32*)value.data);
    }

    /* Clean up */
    UA_Variant_deleteMembers(&value);
    UA_Client_delete(client); /* Disconnects the client internally */
    return status;
}

ちなみに、私はC言語初心者なので、大分基本的な部分から入っていくことになる。

今回は v1.1-dev タグを使っていく。 v1.0 タグだとなぜかビルドできなかった。

git checkout refs/tags/v1.1-dev

open62541.lib のビルド方法は前回の記事を参照のこと。今回は Release - x64 でビルドしたものを使用。

C++のコンソールソリューションを作成する。

上のコードをコピペする。

インクルードパスが足りていないので、足す。

  • <open62541のgitリポジトリがクローンされているパス>\arch
  • <open62541のgitリポジトリがクローンされているパス>\build\src_generated
  • <open62541のgitリポジトリがクローンされているパス>\plugins\include
  • <open62541のgitリポジトリがクローンされているパス>\include

まだエラーがでる。error C2664: 'UA_LocalizedText UA_LOCALIZEDTEXT(char *,char *)': 引数 1 を 'const char [6]' から 'char *' へ変換できません。 とかいうの。

なので、 その他のオプション のところに /Zc:strictStrings- を足す。

エラーは出なくなるが、リンカが通らないので、リンカオプションを足す。

まずは、 追加のライブラリ ディレクトリopen62541.lib があるディレクトリを指定する。

追加の依存ファイルに oepn62541.lib を足す。ただ、これだけだとまだ足りなくて、 ws2_32.lib も必要なので併記しておく。

これでビルドは通るようになる。

ただ、リンクワーニング LINK : warning LNK4098: defaultlib 'LIBCMT' は他のライブラリの使用と競合しています。/NODEFAULTLIB:library を使用してください。 が表示される。

ランタイムライブラリ/MT にすればこの問題は解決する。(この解決策がいいのかは不明)