2012-04-03 1 views
1

Я пытаюсь использовать SWIG для создания оболочек для некоторых моих вызовов функций C++.SWIG TCL Static Linking

Кроме того, я пытаюсь создать собственную оболочку TCL, поэтому мне нужно статически связывать созданные SWIG-библиотеки. У меня есть собственная основная функция с вызовом Tcl_AppInit, где я делаю предварительную настройку.

Чтобы сделать это, какую функцию я должен включить в вызов моей программы Tcl_AppInit? Я обнаружил, что SWIG_init не является правильной функцией. Я даже попробовал Cell_Init, где cell - это имя класса в моем коде, но это тоже не помогает.

Как статические ссылки Объектные файлы SWIG с моей собственной основной функцией и Tcl_Appinit звоните?

В настоящее время, когда я использую следующую команду, чтобы связать свою executabel я получаю следующее сообщение об ошибке:

g++ -o bin/icde src/core/*.o src/read/*.o src/swig/*.o src/icde/*.o -ltk -ltcl 

Я получаю следующее сообщение об ошибке:

src/icde/main.o: In function `AppInit(Tcl_Interp*)': 
main.cpp:(.text+0xa9): undefined reference to `Cell_Init(Tcl_Interp*)' 
collect2: ld returned 1 exit status 

Я проверил ГКЗ/Swig/ячейку. o, который имеет функцию Cell_Init или не использует objdump:

~> objdump -d src/swig/cell.o | grep Cell_Init 
00006461 <Cell_Init>: 
    646c:  75 0a     jne 6478 <Cell_Init+0x17> 

Я не уверен, если я я делаю что-то неправильно во время соединения.

------------------- ОБНОВЛЕНИЕ -------------------------- -

Я обнаружил, что включение файла swig/swig.cxx непосредственно в основной файл, вызывающий функцию Tcl_AppInit, устраняет проблему связывания. Для этого есть причина.

Невозможно ли создать и отдельно связать файл swig с файлом с основной функцией?

+0

В ответ на ваше обновление это возможно, но у вас есть один из самых простых методов. :-) –

ответ

0

В общем, с SWIG вы получите кучу сгенерированных исходных файлов, которые вы компилируете. Обычная вещь, которую вы делаете, заключается в том, чтобы упаковать их в общую библиотеку (с соответствующими зависимостями зависимостей от других разделяемых библиотек), которые можно импортировать во время выполнения Tcl с помощью команды load.

Но вы не хотите, чтобы на этот раз. Вместо этого вы хотите, чтобы файлы объектов, которые вы использовали бы для создания этой общей библиотеки, и вы хотите включить их в инструкции для создания исполняемого файла вместе с объектным файлом, который содержит ваши main и Tcl_AppInit. Вам также необходимо убедиться, что при связывании основного исполняемого файла, который вы делаете , он зависит от внешних библиотек; исполняемое здание требует, чтобы вы удовлетворяли всем зависимостям и привязывали все символы к их определениям. (Вы можете использовать статическую библиотеку, чтобы сделать это проще: она объединяет в себя один набор объектных файлов. Очень мало различий в использовании объектных файлов из него, в частности, статические библиотеки не привязаны к их зависимостям.)

И, наконец, вы do хотите включить звонок Cell_Init в ваш Tcl_AppInit. Это подходящее место для его размещения (ну, пока вы не планируете загружать пакет в суб-интерпретаторы). Если это было неудачно, это было потому, что у вас была неправильная связь. (Совет: компоновщики лучше всего работают, когда объекты и библиотеки на линии ссылок зависят только от вещей позже на линии ссылок.Получение правильного порядка ссылок - это немного черное искусство, когда у вас сложная сборка!)

+0

ОК, есть еще сложность, которую я не охватывал, например, слабосвязанные символы и нетривиальное определение «привязки», но на этот раз вы можете игнорировать это. Понимание этих частей не поможет вам сделать ссылку на код и работать! –

+0

Я сделал все, что вы упомянули. Я даже проверяю объектные файлы, чтобы убедиться, что вызовы функции CellInit существуют с помощью команды objdump. В приведенной выше статье добавлена ​​ссылка. Не могли бы вы сообщить мне, что я делаю неправильно. –

+0

Хм, может быть, что ему нужна ссылка на C++ - способ понимания. Мое знание практик C++ очень шаткое (сам Tcl делается в чистом C по уважительной причине). Если вы нашли что-то, что работает, идите с этим! –