2016-10-17 8 views
0

В продолжение к вопросуперечислений не получает передается TCL, когда мы имеем SWIG TCL Статическая линковка

how to pass enum values from TCL script to C++ class using Swig

Я следующий код

1) Файл: example.i

%module example 
%{ 
     /* Put header files here or function declarations like below */ 
     #include "example.h" 
%} 

%include "example.h" 

2 Файл example.h

class myClass { 
    public: 
     enum Type {one,two}; 
     myClass() {} 
     static bool printVal(int val); 
     static bool printEnum(Type val); 
}; 

3) example.cpp Файл

#include "example.h" 
#include <iostream> 
using namespace std; 

bool myClass::printVal(int val) { 
    cout << " Int Val = " << val << endl; 
    return 0; 
} 

bool myClass::printEnum(type val) { 
    cout << " Enum Val = " << val << endl; 
    return 0; 
} 

Если я связать Swig файлы в виде разделяемой библиотеки она работает отлично

swig -c++ -tcl example.i 
g++ -c -fpic example_wrap.cxx example.cpp -I/usr/local/include 
g++ -shared example.o example_wrap.o -o example.so 
setenv LD_LIBRARY_PATH /pathtoexample.so:$LD_LIBRARY_PATH 
tclsh 
% load example.so 
% myClass_printVal $myClass_one 

Но если код Swig и пример. * Файлы скомпонованы статически я получаю следующее сообщение об ошибке

Глядя вперед для руководства/помощь

+0

Как именно они связаны? –

ответ

0

Во-первых,, если вы используете больше пути к общей библиотеке, вам не нужно изменять переменную LD_LIBRARY_PATH. В том случае, если он находится в текущей директории (удобно для тестирования), вы можете просто сделать следующее:

load ./example.so 

Когда он находится в том же каталоге, что и текущий сценарий, вы вместо того, чтобы сделать это довольно длинную версию:

load [file join [file dirname [info script]] example.so] 
# This also probably works: 
#load [file dirname [info script]]/example.so 

Во-вторых, вы должны проверить, что на самом деле создал этот пример; он может просто использовать другое имя для того, что вы ожидаете. Вы можете использовать info commands, info vars и namespace children, чтобы узнать это; они перечисляют команды, переменные и пространства имен, которые в настоящее время видны.

[EDIT от комментариев для видимости]: Переменные находятся в пространстве имен ::swig.

+0

Раздражающе, моя установка SWIG задыхается, когда я пытаюсь построить и запустить тесты. Это не ваш код, это проблема с моей конфигурацией системы ... –

+1

Да Глобальные переменные входят в swig :: namespace. Спасибо, это помогло. – TechEnthusiast