Я работаю над большим проектом, и случилось так, что в двух местах есть функции, которые принимают одни и те же аргументы и имеют одно и то же имя, хотя они делают другое. Мне посоветовали использовать подход фасада и разместить все в статических библиотеках. Однако это сделало программу чрезвычайно странной. Функции не отделены друг от друга, несмотря на то, что обертки представляют собой отдельные статические библиотеки и имеют отдельные пространства имен. Всегда функция из A.lib называется также также оболочкой B :: BF().C++ Static linking weird behavior
исполняемым:
#include <iostream>
#include "A/AWrapper.h"
#include "B/BWrapper.h"
int main()
{
std::cout<<"A="<<A::AF(2)<<std::endl;
std::cout<<"B="<<B::BF(2)<<std::endl; //uses function int F(int x) from A lib
getchar();
return 0;
}
структура файла выглядит следующим образом:
Dir A:
FA.h, FA.c //function int F(int x) is defined - C language
AWrapper.h, AWrapper.cpp //a simple wrapper function AF of int F(int x); C++
Dir B:
FB.h, FB.c //function int F(int x) is defined - C language
BWrapper.h, BWrapper.cpp //a simple wrapper function AF of int F(int x); C++
И выше была простая программа, вызывающая те. Подробные файлы листинга:
Библиотека --------------:
FA.h:
#ifndef A_H_INCLUDED
#define A_H_INCLUDED
int F(int x);
#endif // A_H_INCLUDED
FA.c:
#include "FA.h"
int F(int x)
{
return x*x;
}
AWrapper.h:
#ifndef AWRAPPER_H_INCLUDED
#define AWRAPPER_H_INCLUDED
namespace A{
int AF(int x);
}
#endif // AWRAPPER_H_INCLUDED
AWrapper.cpp
#include "AWrapper.h"
extern "C"{
#include "FA.h"
}
namespace A{
int AF(int x)
{
return F(x);
}
}
библиотека Б --------------: FB.h:
#ifndef B_H_INCLUDED
#define B_H_INCLUDED
int F(int x);
#endif // B_H_INCLUDED
FB.c:
#include "FB.h"
#define n 5
int F(int x)
{
return -x*x*n;
}
BWrapper.h :
#ifndef BWRAPPER_H_INCLUDED
#define BWRAPPER_H_INCLUDED
namespace B{
int BF(int x);
}
#endif // BWRAPPER_H_INCLUDED
BWrapper.h:
#include "BWrapper.h"
extern "C"{
#include "FB.h"
}
namespace B{
int BF(int x)
{
return F(x);
}
}
Возможно взять взгляд на скомпилирована статическая библиотека B? Удостоверьтесь, что он вызывает правильную функцию? Хотя возможно, что компоновщик заменяет его, когда он ссылается в статической библиотеке «А». –
Хорошо ... он отлично работает, когда нет связанного с lib. – Misery
Вы не можете иметь две глобальные функции, имеющие одно и то же имя, в одном статически связанном двоичном файле. Никакой объем упаковки не поможет. Переименуйте один. –