一 原理
在同一台电脑里,可能会有多个工程同时用到open62541,比较简单的办法是每个工程都拷贝一份open62541源码,但是这样会造成空间浪费,而且open62541的源码包本身也不小。
对于Linux用户来说,可以使用软链接来解决这个问题,具体原理是:
- 在工程外部单独放置一份open62541源码
- 在工程内部使用ln命令创建一个软链接指向工程外部的open62541源码目录
这样使用起来和拷贝一份open62541源码效果一样。
二 例子
首先创建一个简单工程,如下,
在工程外部有一份open62541源码,
此时进入softlink_test目录下,然后使用以下命令创建软链接,
ln -s ../open62541-pack-v1.3.4 open62541
操作如下图,
然后是修改CMakeLists.txt,如下,
cmake_minimum_required(VERSION 3.5)
project(demo)
set(OPEN62541_VERSION "v1.3.4") # 设置版本号
set(UA_ENABLE_AMALGAMATION ON CACHE BOOL "xxx" FORCE) # 设置UA_ENABLE_AMALGAMATION为ON
add_subdirectory(${CMAKE_CURRENT_SOURCE_DIR}/open62541) # 通过软链接来编译open62541
add_executable(demo main.cpp)
target_link_libraries(demo open62541) # 链接libopen62541.a
这里要特别注意:因为只有一份open62541源码,所以不能直接修改open62541源码目录下的CMakeLists.txt ,因为其它工程可能需要不同的配置。
要向上面这样在用户的CMakeLists.txt里通过set命令来修改option,这样改动会保存在CMake的cache里,而且是专属于这个工程,不会对其它工程产生影响。可以参考这篇和这篇文章。
main.cpp内容如下,比较简单的server,
// server.c
#include <signal.h>
#include <stdlib.h>
#include "open62541.h"
UA_Boolean running = true;
static void stopHandler(int sign) {
UA_LOG_INFO(UA_Log_Stdout, UA_LOGCATEGORY_SERVER, "received ctrl-c");
running = false;
}
int main(void)
{
signal(SIGINT, stopHandler);
signal(SIGTERM, stopHandler);
UA_Server *server = UA_Server_new();
UA_ServerConfig_setDefault(UA_Server_getConfig(server));
UA_StatusCode retval = UA_Server_run(server, &running);
UA_Server_delete(server);
return retval == UA_STATUSCODE_GOOD ? EXIT_SUCCESS : EXIT_FAILURE;
}
最后进入build目录下执行cmake .. && make
进行编译就可以了。