Есть ли способ заставить несколько определенных символов, используя GCC / Clang в Linux? - PullRequest
1 голос
/ 30 октября 2019

Я работаю с двумя отдельными библиотеками ( 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

Когда я переносу код и библиотеки на свой тестовый ящик Linux, я использую cmake для сборки и компоновки всего. Проект правильно компилируется и связывается, но при запуске я получаю неожиданную ошибку сегментации. Я сузил это до взаимодействия между двумя библиотеками, создавая программы-заглушки, используя одну библиотеку за раз, и подтверждая, что они работают как положено. Только когда я соединяю обе библиотеки, у меня возникают проблемы. Я думаю, что это справедливое предположение, что одна и та же ошибка с множественными определенными символами вызывает эту ошибку сегмента в Linux, просто по какой-то причине она не обнаруживается во время компиляции.

Я перепробовал целый узел компиляции и компоновщикафлаги (используя GCC и Clang), чтобы построить этот проект, чтобы попытаться решить эту проблему. Я пробовал -fvisibility=hidden -shared -nostdlib. Я нашел -symbolic в документации GCC , но при попытке его использовать я получаю сообщение об ошибке "опция не распознана". Первоначально я статически связывался с предварительно собранными библиотеками, но также пытался динамически связывать, а также сам собирал azure-iot-sdk с остальной частью моего кода. Я получаю один и тот же результат каждый раз.

По сути, мой вопрос сводится к тому, есть ли какой-нибудь эквивалент / FORCE: MULTIPLE для цепочки инструментов Linux (GCC, Clang, я нене важно), что может решить эту проблему. Или есть какое-то альтернативное решение, которое я каким-то образом упустил из-за долгих часов поиска и устранения неисправностей?

1 Ответ

0 голосов
/ 31 октября 2019

Я решил продолжить работу, выполнив два отдельных процесса с межпроцессным взаимодействием для решения этой проблемы.

Хотя, возможно, можно было использовать другое решение, такое как objcopy,Поскольку я не знаю точно, что происходит в этих библиотеках, и у меня нет времени, чтобы ознакомиться со всем исходным кодом Microsoft, кажется, что путь наименьшего сопротивления - использование двух процессов. Спасибо всем за вашу помощь с этим и, надеюсь, эта тема может помочь кому-то в будущем.

...