Я работаю с двумя отдельными библиотеками ( PLCIO и azure-iot-sdk-c ) над проектом. Этот проект разрабатывается главным образом для Windows с использованием Visual Studio, но должен работать на Linux в рабочей среде. В настоящее время я использую коробку Ubuntu для имитации производства. При компиляции программы в Visual Studio под Windows я получаю ошибки компоновщика LNK2005 и LNK1169 . Я решил эту проблему с помощью опции компоновщика / FORCE: MULTIPLE в Visual Studio. Наше приложение компилируется и работает, как и ожидалось, в Windows.
![Visual Studio Linker Errors Screenshot](https://i.gyazo.com/13e685d3c08b7bd6b24f12291c64b341.png)
Когда я переносу код и библиотеки на свой тестовый ящик Linux, я использую cmake для сборки и компоновки всего. Проект правильно компилируется и связывается, но при запуске я получаю неожиданную ошибку сегментации. Я сузил это до взаимодействия между двумя библиотеками, создавая программы-заглушки, используя одну библиотеку за раз, и подтверждая, что они работают как положено. Только когда я соединяю обе библиотеки, у меня возникают проблемы. Я думаю, что это справедливое предположение, что одна и та же ошибка с множественными определенными символами вызывает эту ошибку сегмента в Linux, просто по какой-то причине она не обнаруживается во время компиляции.
Я перепробовал целый узел компиляции и компоновщикафлаги (используя GCC и Clang), чтобы построить этот проект, чтобы попытаться решить эту проблему. Я пробовал -fvisibility=hidden
-shared
-nostdlib
. Я нашел -symbolic
в документации GCC , но при попытке его использовать я получаю сообщение об ошибке "опция не распознана". Первоначально я статически связывался с предварительно собранными библиотеками, но также пытался динамически связывать, а также сам собирал azure-iot-sdk с остальной частью моего кода. Я получаю один и тот же результат каждый раз.
По сути, мой вопрос сводится к тому, есть ли какой-нибудь эквивалент / FORCE: MULTIPLE для цепочки инструментов Linux (GCC, Clang, я нене важно), что может решить эту проблему. Или есть какое-то альтернативное решение, которое я каким-то образом упустил из-за долгих часов поиска и устранения неисправностей?