2013-02-11 3 views
1

У меня проблема: В мое приложение Qt я связываю несколько общих (.so) библиотек, и некоторые из них включают файлы soapC.cpp, которые автоматически генерируются gSoap исходные файлы. Файлы soapC.cpp не совсем одинаковы в разных .so-библиотеках, но содержат много одинаковых функций, позволяют называть их foo().C++: конфликт во время выполнения одних и тех же функций, определенных в разных связанных библиотеках

Когда я создаю свое приложение, я связываю все эти библиотеки в определенном порядке, допустим, lib1.so, lib2.so, lib3.so, ... и т. Д., И компиляция выполняется плавно (я использую компилятор g ++ v. 4.6).

Когда я запускаю приложение, я заметил, что когда часть кода, скажем в lib3.so, пытается вызвать foo(), которая также определена в lib3.so, по некоторым причинам foo() из lib1.so называется вместо этого. Это вызывает проблемы и мое приложение segfaults.

Мой вопрос в том, есть ли опция C++/linker, которую я мог бы передать компилятору, что привело бы к тому, что во время выполнения моего приложения действительно foo() из lib3.so, откуда он называется, будет выполняться, а не foo() из lib1.so? Я пробовал -символические и -символьные функции без везения.

Возможное решение этого - использование пространств имен, но из-за большой сложности кода это скорее последнее возможное решение. Если бы было быстрое и простое решение, было бы здорово. Btw. Я делаю это под Ubuntu, под Windows тот же код работает отлично и делает то, что он должен ...

+2

Я думаю, что здравый исправление было бы добавить поддержку пространства имен генератора кода gsoap, либо использовать его она должна быть уже там. Обратите внимание, что https://github.com/KDAB/KDSoap поддерживает пространства имен :) (Отказ от ответственности: я работаю для KDAB) –

+0

Спасибо, я знаю, но, как я уже сказал, пространства имен являются скорее последним вариантом просто потому, что рефакторинг кода во всем проекте будет просто слишком большим ... Я больше ищу ярлык ... –

ответ

1

Я предполагаю, что конфликтующие функции в сгенерированном коде?

Пространства имен - это самое простое исправление, вам не нужно пространство имен для каждого заголовка и файла cpp, просто оберните их! Создайте единый заголовок и файл cpp для каждой библиотеки, а также #include все созданные заголовки и исходные файлы в каждой и только скомпилируйте cpp оболочки в библиотеку. Также будет ограничиваться поломка, если файлы должны быть регенерированы (в худшем случае вам нужно добавить заголовок или cpp в свою обертку).

lib1.h

namespace lib1 { 
#include "generated header 1.h" 
#include "generated header 2.h" 
#include "generated header 3.h" 
} 

lib1.cpp

namespace lib1 { 
#include "generated source file 1.cpp" 
#include "generated source file 2.cpp" 
#include "generated source file 3.cpp" 
}