qt — c ++: конфликт времени выполнения тех же функций, определенных в разных связанных библиотеках

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

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

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

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

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

1

Решение

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

Пространства имен — это самое простое решение: вам не нужно указывать пространство имен для каждого заголовка и файла cpp, просто оберните их! Создайте один заголовочный файл и файл cpp для каждой библиотеки, и включите все сгенерированные заголовочные файлы и исходные файлы в каждом из них, и только скомпилируйте оболочку cpp в библиотеку. Также ограничит поломку, если файлы будут регенерированы (в худшем случае, нужно добавить header или 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"}
1

Другие решения

Других решений пока нет …