SWIG TCL Статическое связывание - PullRequest
1 голос
/ 03 апреля 2012

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

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

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

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

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

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

Я проверил файл src / swig / cell.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 и файл с основной функцией?

1 Ответ

0 голосов
/ 03 апреля 2012

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

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

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

...