Имя: Пароль:
1C
1С v8
Внешняя компонента 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 можно написать, только не совсем ВК получиться.
Здесь можно обсудить любую тему при этом оставаясь на форуме для 1Сников, который нужен для работы. Ymryn