前回の記事で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
にすればこの問題は解決する。(この解決策がいいのかは不明)