Предположим, у меня есть библиотека somelib.a
, которая распространяется менеджером пакетов как двоичная.И эта библиотека использует только библиотеку заголовков anotherlib.hpp
.
Если я сейчас свяжу свою программу с somelib.a
, а также использую anotherlib.hpp
, но с другой версией, то это может привести к UB,если somelib.a
использует части anotherlib.hpp
в своих include
заголовках.
Но что произойдет, если somelib.a
будет ссылаться / использовать anotherlib.hpp
только в своих файлах cpp (поэтому я незнаете что он их использует)?Будет ли шаг связывания между моим приложением и somelib.a
гарантировать, что somelib.a
и мое приложение будут использовать свою собственную версию anotherlib.hpp
.
Причина, по которой я спрашиваю, заключается в том, чтобы связать отдельные единицы компиляции моегоПрограмма до конечной программы, затем компоновщик удаляет дубликаты символов (в зависимости от того, является ли это внутренней связью или нет).Таким образом, библиотека только для заголовков обычно пишется так, чтобы можно было удалить дубликаты символов.
Минимальный пример
somelib.a
построен на системе с nlohmann/json.hpp версия 3.2
somelib / somelib.h
namespace somelib {
struct config {
// some members
};
config read_configuration(const std::string &path);
}
somelib.cpp
#include <nlohmann/json.hpp>
namespace somelib {
config read_configuration(const std::string &path)
{
nlohmann::json j;
std::ifstream i(path);
i >> j;
config c;
// populate c based on j
return c;
}
}
приложение построено на другой системе с nlohmann / json.hpp версии 3.5 и 3.2 и 3.5 не совместимы, а затем приложение связывается с somelib.a
, который был собран в системе с версией 3.2
application.cpp
#include <somelib/somelib.h>
#include <nlohmann/json.hpp>
#include <ifstream>
int main() {
auto c = somelib::read_configuration("config.json");
nlohmann::json j;
std::ifstream i("another.json");
i >> j;
return 0;
}