shtrih-m / fr_drv_ng_examples

Примеры использования https://github.com/shtrih-m/fr_drv_ng
10 stars 2 forks source link

Собрать пример под C# #27

Closed MaxFalcone closed 2 years ago

MaxFalcone commented 2 years ago

Здравствуйте, помогите пожалуйста со сборкой примера для C#. Не могли бы вы написать с какими параметрами надо cmake запускать чтобы под Windows собралось?

Я запустил swig

C:\Temp\swig\x86_64>..\swigwin-4.0.2\swig.exe -c++ -csharp -namespace ru.shtrih_m.fr_drv_ng.classic_interface -o classic_interface_wrap.cxx classic_interface.i

Создал CMakeLists

project(Suxx)
cmake_minimum_required(VERSION 3.18)

add_library(classic_fr_drv_ng_csharp SHARED classic_interface_wrap.cxx)
set_target_properties(classic_fr_drv_ng_csharp PROPERTIES CXX_VISIBILITY_PRESET default)
target_link_libraries(classic_fr_drv_ng_csharp classic_fr_drv_ng)

Сгенерировал проект

C:\Temp\swig\x86_64>cmake .
-- Building for: Visual Studio 16 2019
-- Selecting Windows SDK version 10.0.18362.0 to target Windows 10.0.19043.
-- The C compiler identification is MSVC 19.28.29336.0
-- The CXX compiler identification is MSVC 19.28.29336.0
-- Detecting C compiler ABI info
-- Detecting C compiler ABI info - done
-- Check for working C compiler: C:/Program Files (x86)/Microsoft Visual Studio/2019/Enterprise/VC/Tools/MSVC/14.28.29333/bin/Hostx64/x64/cl.exe - skipped
-- Detecting C compile features
-- Detecting C compile features - done
-- Detecting CXX compiler ABI info
-- Detecting CXX compiler ABI info - done
-- Check for working CXX compiler: C:/Program Files (x86)/Microsoft Visual Studio/2019/Enterprise/VC/Tools/MSVC/14.28.29333/bin/Hostx64/x64/cl.exe - skipped
-- Detecting CXX compile features
-- Detecting CXX compile features - done
-- Configuring done
-- Generating done
-- Build files have been written to: C:/Temp/swig/x86_64

Пришлось поменять строчку #include <classic_interface.h> на #include "classic_interface.h" иначе ссылка на заголовок не находилась.

Но сбилдить его не могу. Выдаётся 306 ошибок линковки. Наверно я неправильно указываю какой-то параметр. Пробовал собрать и через Visual Studio 2019 и из командной строки.

Rebuild started...
1>------ Rebuild All started: Project: ZERO_CHECK, Configuration: Release x64 ------
1>Checking Build System
2>------ Rebuild All started: Project: classic_fr_drv_ng_csharp, Configuration: Release x64 ------
2>Building Custom Rule C:/Temp/swig/x86_64/CMakeLists.txt
2>classic_interface_wrap.cxx
2>C:\Temp\swig\x86_64\classic_interface_wrap.cxx(19835,3): warning C4244: 'argument': conversion from 'int64_t' to 'double', possible loss of data
2>   Creating library C:/Temp/swig/x86_64/Release/classic_fr_drv_ng_csharp.lib and object C:/Temp/swig/x86_64/Release/classic_fr_drv_ng_csharp.exp
2>classic_fr_drv_ng.lib(classic_interface.obj) : error LNK2019: unresolved external symbol "void __cdecl ng_tools::setLogCallBackFunction(void (__cdecl*const)(class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > const &))" (?setLogCallBackFunction@ng_tools@@YAXQ6AXAEBV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@@Z@Z) referenced in function "public: static void __cdecl classic_interface::setLogCallback(void (__cdecl*const)(class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > const &))" (?setLogCallback@classic_interface@@SAXQ6AXAEBV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@@Z@Z)
2>classic_fr_drv_ng.lib(classic_interface.obj) : error LNK2019: unresolved external symbol "public: static enum fr_drv_ng::MessagesLanguage __cdecl fr_drv_ng::Localizer::currentLang(void)" (?currentLang@Localizer@fr_drv_ng@@SA?AW4MessagesLanguage@2@XZ) referenced in function "char const * __cdecl noErrorMessage(void)" (?noErrorMessage@@YAPEBDXZ)
2>classic_fr_drv_ng.lib(classic_interface_impl.obj) : error LNK2001: unresolved external symbol "public: static enum fr_drv_ng::MessagesLanguage __cdecl fr_drv_ng::Localizer::currentLang(void)" (?currentLang@Localizer@fr_drv_ng@@SA?AW4MessagesLanguage@2@XZ)

................

2>C:\Temp\swig\x86_64\Release\classic_fr_drv_ng_csharp.dll : fatal error LNK1120: 292 unresolved externals
2>Done building project "classic_fr_drv_ng_csharp.vcxproj" -- FAILED.
========== Rebuild All: 1 succeeded, 1 failed, 0 skipped ==========
3man001 commented 2 years ago

Запуск swig swig -c++ -csharp -namespace ru.shtrih_m.fr_drv_ng.classic_interface -dllimport classic_fr_drv_ng_csharp.dll -o csharp/classic_interface_wrap.cxx classic_interface.i

Содержимое CMakeLists.txt

cmake_minimum_required(VERSION 3.22)
project(classic_fr_drv_ng_csharp)
add_library(classic_fr_drv_ng_csharp SHARED csharp/classic_interface_wrap.cxx)
set_target_properties(classic_fr_drv_ng_csharp PROPERTIES CXX_VISIBILITY_PRESET default)
target_link_libraries(classic_fr_drv_ng_csharp classic_fr_drv_ng)

Через cmake-gui сгенерировал проект. поправил #include Подкинул динамическую classic_fr_drv_ng.lib Сделал релиз.

MaxFalcone commented 2 years ago

Я смог скомпилировать проект по этим шагам. image

Но полученную библиотеку не могу в итоге использовать, возникает ошибка. image

3man001 commented 2 years ago

В проект добавили файлы .cs которые swig сделал? Они делают подключение этой обертки к проекту .net. У меня это файлы: BytesVector.cs classic_fr_drv_ng.cs classic_fr_drv_ngPINVOKE.cs classic_interface.cs SWIGTYPE_p_f_r_q_conststdstringvoid.cs SWIGTYPE_p_stdfunctionT_void_fstd__string_const_RF_t.cs

MaxFalcone commented 2 years ago

Действительно файлов в проекте не было (казалось бы должен был генератор их туда добавить), но я добавил и перекомпилировал. image Не помогло, ошибка та же. Может ещё на библиотеку надо как-то сослаться?

3man001 commented 2 years ago

На скрине проект обертки на C++ ему эти файлы бесполезны, а вот они уже ссылаются на результат этого проекта. Эти файлы должны быть в вашем C# проекте.

MaxFalcone commented 2 years ago

Я сдался и написал C# обёртку вокруг COM-объекта просто перечислив все вызовы функций.