|
Внешняя компонента Native Api на C++ под Linux (Ubuntu x64) на 1С 8.3 | ☑ | ||
---|---|---|---|---|
0
alexeyomg
05.08.15
✎
13:44
|
Пишу ВК, не могу подключить к 1с на ubuntu. Даже экзапл от 1с не подключается. Поэтому вопрос по нему:
1) Пытаюсь подключи ВК из примера VNCOMPS, приведённым в статье http://its.1c.ru/db/metodtorg#content:3221:hdoc (ссылку можно найти в самом конце: «Копирование»). Внутри в проекте NativeApi есть makefile. С его помощью я собираю .so библиотеку на Ununtu. Но при "ПодключитьВнешнююКомпоненту" 1с вылетает. Аналогично, если собираю при помощи "build.sh" (в корне проекта). В самом makefile меняю флаг с m32 на m64, т.к. 1с и сама система x64. (с параметром m32 не подцепляется всё равно) Вот пример вызова ВК из 1С 8.3: ПодключениеВыполнено = ПодключитьВнешнююКомпоненту("/home/alexeyubuntux64-20gb/Документы/VNCOMP83/example/NativeAPI/AddInNative.so", "AddInNative", ТипВнешнейКомпоненты.Native); Есть статейка как раз на эту тему http://catalog.mista.ru/public/323372 . Но, насколько я вижу, все эти моменты уж учтены исправили в VNCOMPS примере. Но по сути дело в параметрах компиляции. Мб 32битная внешняя компонента подцепляется к 32-x битной 1с нормально, но я развернул на Ubuntu x64 1c enterprise83 8.3.5-1486 amd64. И хочу к ней подцепить ВК. Есть у кого мысли, как решить этот вопрос?) VNCOMPS-пример должен работать, но походу надо поправить параметры сборки, или сама платформа, на которой я тестирую - некорректна. |
|||
1
orefkov
05.08.15
✎
14:46
|
(0)
Раз 1С вылетает - значит, всё-таки подгружает твою ВК. Ищи, где в твоем коде вылет. Самое простое - в своей ВК пиши в какойнить файл трассировку выполнения. |
|||
2
alexeyomg
05.08.15
✎
14:49
|
я пишу логи в каждом методе.
в лог файле - пусто. |
|||
3
orefkov
05.08.15
✎
15:05
|
ldd AddInNative.so что показывает?
|
|||
4
alexeyomg
05.08.15
✎
16:05
|
linux-vdso.so.1 => (0x00007ffc627fc000)
libstdc++.so.6 => /usr/lib/x86_64-linux-gnu/libstdc++.so.6 (0x00007f16beffd000) libgcc_s.so.1 => /lib/x86_64-linux-gnu/libgcc_s.so.1 (0x00007f16bede6000) libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f16bea1c000) libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007f16be714000) /lib64/ld-linux-x86-64.so.2 (0x00007f16bf515000) (3) |
|||
5
trdm
05.08.15
✎
16:20
|
отладчик есть? Пустить через него.
Помнится отладка 1С++ очень хорошо выручала |
|||
6
xaozai
05.08.15
✎
16:26
|
+(5) Не знаю, как у вас с линуксами, а когда компоненту на С++ под Win писал, то мне оч. помогала возможность отладчика MS Visual Studio приаттачить процесс 1cv8.exe "Attach to Process". Бряк, при этом, в самой компоненте ставится, при инициализации, например.
|
|||
7
bolero
05.08.15
✎
18:39
|
gdb /opt/1C/v8.3/*/1cv8
run bt |
|||
8
alexeyomg
06.08.15
✎
10:01
|
(7) [New Thread 0x7fff4920a700 (LWP 8284)]
[Thread 0x7fff4920a700 (LWP 8284) exited] *** Error in `/opt/1C/v8.3/x86_64/1cv8c': free(): invalid next size (fast): 0x0000000003327780 *** это выводит при подключении ВК |
|||
9
alexeyomg
06.08.15
✎
10:14
|
ну на винде цепляется эти компонента (которую я сбилтил через VS).
для ubuntu я изменяю следующее, чтобы норм сбилдить .so: 1) build.sh имеют следующие команды: #!/bin/sh PATH=~/cmake-2.8/bin:$PATH set -e mkdir build64_310 ; cd build64_310 ; cmake -D XUL_VERSION:STRING="31.0" -D CMAKE_BUILD_TYPE:STRING=RelWithDebInfo -D TARGET_PLATFORM_32:BOOL=OFF --build .. ; cd .. cd build64_310 ; make -j 4 ; cd ..; rm -rf build64_310 вместо полного: #!/bin/sh #build script for CentOS 5 PATH=~/cmake-2.8/bin:$PATH set -e echo "Build 32 310" ; if [ ! -d build32_310 ]; then mkdir build32_310 ; cd build32_310 ; scl enable devtoolset-2 'cmake -D XUL_VERSION:STRING="31.0" -D TARGET_PLATFORM_32:BOOL=ON -D CMAKE_SHARED_LINKER_FLAGS:STRING=-m32 -D CMAKE_MODULE_LINKER_FLAGS:STRING=-m32 -D CMAKE_EXE_LINKER_FLAGS:STRING=-m32 -D CMAKE_BUILD_TYPE:STRING=RelWithDebInfo --build .. '; cd .. fi ; cd build32_310 ; scl enable devtoolset-2 'make -j 4' ; cd .. ; rm -rf build32_310 echo "Build 64 310" ; if [ ! -d build64_310 ]; then mkdir build64_310 ; cd build64_310 ; scl enable devtoolset-2 'cmake -D XUL_VERSION:STRING="31.0" -D CMAKE_BUILD_TYPE:STRING=RelWithDebInfo -D TARGET_PLATFORM_32:BOOL=OFF --build .. '; cd .. fi ; cd build64_310 ; scl enable devtoolset-2 'make -j 4' ; cd ..; rm -rf build64_310 2) в CMakeLists.txt убрал несколько строк, чтобы собиралось только NAtiveAPI. Убрал следующее: IF("${XUL_VERSION}" STREQUAL "") MESSAGE(FATAL_ERROR "XUL_VERSION must have value!") ENDIF("${XUL_VERSION}" STREQUAL "") add_subdirectory (AddInFF ) add_subdirectory (AddInChrome) P.S. Мб я что-то лишнее убрал?) но мб всё по делу. всё собирается норм, но не подключается к 1с. Пытаюсь подцепить компонентц эту x32, выдаётся "Ложь", а не вылетает. Ну это так, как доп инфа. |
|||
10
alexeyomg
06.08.15
✎
12:26
|
всё. получилось подключить более менее шаблон этот. я хз что изменилось, но раньше метод GetClassNames не вызывался. логов не было...
вылетало в самом первом методе, который вызывается 1с-кой "GetClassNames". В итоге в логах всё норм пишет, что вызывается GetClassNames GetClassObject CAddInNative Init Но установить такие же параметры в моём проекте, что и в тестовом проекте у меня так и не получается. Мне нужно в одном cmakelists прописать все правила, что описаны в cmakelists(корень примера этого) и makefile (NativeApi проект) тестового примера. Посмотрите плз. Что коряво написано: Это мой Cmakelists cmake_minimum_required(VERSION 3.2) SET(ProjectName "A1CFclientClionNativeApi") project(${ProjectName}) SET(CMAKE_CXX_FLAGS ${CMAKE_CXX_FLAGS} "-m64 -std=c++11") SET(CMAKE_C_FLAGS ${CMAKE_C_FLAGS} "-m64") SET(CMAKE_BUILD_TYPE RelWithDebInfo) SET(TARGET_PLATFORM_32 OFF) SET(INCLUDE_DIRECTORIES "/usr/include") include_directories("${INCLUDE_DIRECTORIES}" ) link_directories( "/usr/lib/x86_64-linux-gnu") SET(SOURCE_FILES AddInNative.cpp dllmain.cpp AddInNative.h ComponentBase.h IMemoryManager.h types.h com.h stdafx.h stdafx.cpp AddInDefBase.h) set_source_files_properties(${SOURCE_FILES} PROPERTIES COMPILE_FLAGS "-finput-charset=WINDOWS-1251 -fPIC ") add_library(${ProjectName} SHARED ${SOURCE_FILES}) set_target_properties(${ProjectName} PROPERTIES COMPILE_FLAGS "-m64" LINK_FLAGS "-m64") target_link_libraries (${ProjectName} "${REQUIRED_LIBRARIES}") |
|||
11
alexeyomg
06.08.15
✎
12:27
|
А это makefile проекта NativeApi из примера:
TARGET=AddInNative.so SOURCES=AddInNative.cpp \ dllmain.cpp \ stdafx.cpp LIBS=pthread OBJECTS=$(SOURCES:.cpp=.o) INCLUDES=-I../../include CXXLAGS=$(CXXFLAGS) $(INCLUDES) -m32 -finput-charset=WINDOWS-1251 -fPIC all: $(TARGET) -include $(OBJECTS:.o=.d) %.o: %.cpp g++ -c $(CXXLAGS) $*.cpp -o $*.o g++ -MM $(CXXLAGS) $*.cpp > $*.d @mv -f $*.d $*.d.tmp @sed -e 's|.*:|$*.o:|' < $*.d.tmp > $*.d @sed -e 's/.*://' -e 's/\\$$//' < $*.d.tmp | fmt -1 | \ sed -e 's/^ *//' -e 's/$$/:/' >> $*.d @rm -f $*.d.tmp $(TARGET): $(OBJECTS) Makefile g++ $(CXXLAGS) -shared $(OBJECTS) -o $(TARGET) $(addprefix -l, $(LIBS)) clean: -rm $(TARGET) *.o *.d И cmakelists решения всего: # Cmake script for project AddIn # autor: 1C cmake_minimum_required (VERSION 2.6) project (AddIn) message(STATUS "System: " ${CMAKE_SYSTEM_NAME} " " ${CMAKE_SYSTEM_VERSION}) message(STATUS "Processor: " ${CMAKE_HOST_SYSTEM_PROCESSOR}) if (UNIX) set(MySuffix1 "Lin") if (APPLE) set(MySuffix1 "Mac") endif(APPLE) else(UNIX) set(MySuffix1 "Win") include(Platform/Windows-cl) endif(UNIX) set(BUILD_DIR "build") set(CMAKE_SKIP_RPATH ON CACHE TYPE BOOL) OPTION(TARGET_PLATFORM_32 "Build target for i386" OFF) MARK_AS_ADVANCED(TARGET_PLATFORM_32) if (TARGET_PLATFORM_32) set(MySuffix2 "32") set (CMAKE_CXX_FLAGS ${CMAKE_CXX_FLAGS} "-m32") set (CMAKE_C_FLAGS ${CMAKE_C_FLAGS} "-m32") else() set(MySuffix2 "64") set (CMAKE_CXX_FLAGS ${CMAKE_CXX_FLAGS} "-m64") set (CMAKE_C_FLAGS ${CMAKE_C_FLAGS} "-m64") endif() set (LIBRARY_OUTPUT_PATH ${CMAKE_SOURCE_DIR}/bin) set (EXECUTABLE_OUTPUT_PATH ${LIBRARY_OUTPUT_PATH}) IF("${XUL_VERSION}" STREQUAL "") MESSAGE(FATAL_ERROR "XUL_VERSION must have value!") ENDIF("${XUL_VERSION}" STREQUAL "") include_directories(BEFORE . ${CMAKE_SOURCE_DIR}../include) add_subdirectory (AddInFF ) add_subdirectory (NativeAPI) add_subdirectory (AddInChrome) if (WIN32) add_subdirectory(AddInIE) endif (WIN32) |
|||
12
alexeyomg
06.08.15
✎
15:00
|
Тема закрыта. с типами данных запара была. а ну да. в этом примере от 1С в методе GetClassNames идёт return s_names;, а надо взять код этой функции из шаблона (рядом с примерами лежит):
static WCHAR_T* names = 0; if (!names) ::convToShortWchar(&names, g_kClassNames); return names; но это одна из мелочей. у меня до этого вообще даже в начало этой функции на заходило (по логами видно было). более менее качественно ещё раз прописал параметры сборки и всё зафурычило. Кому нужно, вот так получился cmakelists: cmake_minimum_required(VERSION 3.2) set(ProjectName "A1CFclientClionNativeApi") project(${ProjectName}) set(LIBRARY_OUTPUT_PATH ${CMAKE_SOURCE_DIR}/bin) set(EXECUTABLE_OUTPUT_PATH ${LIBRARY_OUTPUT_PATH}) set(CMAKE_CXX_FLAGS ${CMAKE_CXX_FLAGS} "-m64 -std=c++11") set(CMAKE_C_FLAGS ${CMAKE_C_FLAGS} "-m64") SET(CMAKE_BUILD_TYPE RelWithDebInfo) set_source_files_properties(${AddInNative_SRC} PROPERTIES COMPILE_FLAGS "-finput-charset=WINDOWS-1251 -fPIC ") set(INCLUDE_DIRECTORIES "/usr/include") include_directories("${INCLUDE_DIRECTORIES}" ) link_directories( "/usr/lib/x86_64-linux-gnu") set(SOURCE_FILES AddInNative.cpp dllmain.cpp AddInNative.h ComponentBase.h IMemoryManager.h types.h com.h stdafx.h stdafx.cpp AddInDefBase.h) set_source_files_properties(${SOURCE_FILES} PROPERTIES COMPILE_FLAGS "-finput-charset=WINDOWS-1251 -fPIC ") add_library(${ProjectName} SHARED ${SOURCE_FILES}) set_target_properties( ${ProjectName} PROPERTIES CLEAN_DIRECT_OUTPUT 1 OUTPUT_NAME ${ProjectName} ) target_link_libraries (${ProjectName} "${REQUIRED_LIBRARIES}") |
|||
13
H A D G E H O G s
06.08.15
✎
15:13
|
(12) Никому не нужно. Пусть горит в огне адовом этот ubuntu.
|
|||
14
Гёдза
06.08.15
✎
15:15
|
Интересно, а на яве можно внешнюю компоненту написать?
|
|||
15
alexeyomg
07.08.15
✎
12:11
|
(14) походу нет. вот выдержка из статьи по технологиям ВК:
"В качестве средств разработки можно применять: Microsoft Visual C++, Delphi, C++ Builder, gcc" |
|||
16
Garykom
гуру
07.08.15
✎
12:15
|
(13) хм, может сначала "окна" 10-ку поставите?
а потом уже будем ругать линукс |
|||
17
qwerty2469
07.08.15
✎
13:03
|
(14) В принципе на java можно написать, только не совсем ВК получиться.
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |