Допустим, есть сторонняя статическая библиотека которая экспортирует некую функцию (export "C" void Func(...)) и линкуется в DLL. Также, в эту же DLL линкуется моя статическая библиотека с такой же функцией.
Есть ли штатные способы указать линкеру, что бы он принудительно использовал мою версию функции (желательно под VS2013). Если нет, то что посоветуете? Интересует как подставить свою версию, а не как разрешить конфликт.
Здравствуйте, Videoman, Вы писали:
V>Допустим, есть сторонняя статическая библиотека которая экспортирует некую функцию (export "C" void Func(...)) и линкуется в DLL. Также, в эту же DLL линкуется моя статическая библиотека с такой же функцией. V>Есть ли штатные способы указать линкеру, что бы он принудительно использовал мою версию функции (желательно под VS2013). Если нет, то что посоветуете? Интересует как подставить свою версию, а не как разрешить конфликт.
Здравствуйте, Videoman, Вы писали:
V>Допустим, есть сторонняя статическая библиотека которая экспортирует некую функцию (export "C" void Func(...)) и линкуется в DLL. Также, в эту же DLL линкуется моя статическая библиотека с такой же функцией. V>Есть ли штатные способы указать линкеру, что бы он принудительно использовал мою версию функции (желательно под VS2013). Если нет, то что посоветуете? Интересует как подставить свою версию, а не как разрешить конфликт.
Очень просто добавь в link опцию /force:multiple и кто был первым в списке линковки тот и будет вызываться.
Спасибо, но мне такой вариант с патчем, если я правильно понял, не подойдет. Библиотека подтягивается несколькими проектами. Хотя, есть мысль, может быть имеет смысл сделать две версии. Надо подумать.
Здравствуйте, kov_serg, Вы писали:
_>Очень просто добавь в link опцию /force:multiple и кто был первым в списке линковки тот и будет вызываться.
Нужно будет попробовать, но видится следующая проблема: эта опция, по всей видимости, будет не избирательно действовать на всё конфликты. Интересно, неужели нельзя точно указать нужные символы, ну или имена объектников в либе которые нужно игнорировать в конкретной конфигурации.
Здравствуйте, Videoman, Вы писали:
V>Спасибо, но мне такой вариант с патчем, если я правильно понял, не подойдет. Библиотека подтягивается несколькими проектами. Хотя, есть мысль, может быть имеет смысл сделать две версии. Надо подумать.
Может быть патчить "на лету" копию и подставлять её линкеру?
Здравствуйте, Videoman, Вы писали:
V>Здравствуйте, kov_serg, Вы писали:
_>>Очень просто добавь в link опцию /force:multiple и кто был первым в списке линковки тот и будет вызываться.
V>Нужно будет попробовать, но видится следующая проблема: эта опция, по всей видимости, будет не избирательно действовать на всё конфликты. Интересно, неужели нельзя точно указать нужные символы, ну или имена объектников в либе которые нужно игнорировать в конкретной конфигурации.
Не очень понимаю за что вы переживаете все конфликты он из разряда error переводит в warning.
Так что вы их всё равно увидите. Что смущает, не академичность метода?
Здравствуйте, kov_serg, Вы писали:
_>Так что вы их всё равно увидите.
За идею спасибо. Если уж совсем не будет никаких "прямых" вариантов то можно будет зафорсить.
_>Что смущает, не академичность метода?
Да. Ведь, вроде, известна библиотека, известны функции... Смущает то, что в коде с варнингами борюсь, а тут придется глаза закрывать. И еще, из опыта, всегда стараюсь избегать вещей которые зависят от порядка включения заголовков или библиотек. В будущем очень легко случайно поменять порядок и получить не рабочую dll в инсталяторе.
Videoman:
V>Допустим, есть сторонняя статическая библиотека которая экспортирует некую функцию (export "C" void Func(...)) и линкуется в DLL. Также, в эту же DLL линкуется моя статическая библиотека с такой же функцией. V>Есть ли штатные способы указать линкеру, что бы он принудительно использовал мою версию функции (желательно под VS2013). Если нет, то что посоветуете? Интересует как подставить свою версию, а не как разрешить конфликт.
ЕМНИП, при экспорте можно задавать новые имена для символов и даже переименовывать.
Можно поиграться с ключами компилятора, линкера, c def-файлами с #pragma comment.
Имхо, задача решаемая.
ЗЫ. Вспомнил еще два способа задания линковочных алиасов.
1. ASM-файл c public, extrn и EQU (или "="?).
2. Колдовство с линковочными скриптами gcc, но это на крайний случай...
Здравствуйте, Videoman, Вы писали:
V>Здравствуйте, kov_serg, Вы писали:
_>>Так что вы их всё равно увидите. V>За идею спасибо. Если уж совсем не будет никаких "прямых" вариантов то можно будет зафорсить.
Прямые варианты длинные и менее красивые. А именно патчить obj файлы -- переименовывать или удалять функции внутри объектника (благо контрольных сумм там нету) https://support.microsoft.com/ru-ru/help/121460/common-object-file-format-coff http://wiki.osdev.org/COFF http://www.benf.org/other/wumpbin/index.html
штатный dumpbin/editbin так не умеют. зато руками можно.
_>>Что смущает, не академичность метода? V>Да. Ведь, вроде, известна библиотека, известны функции... Смущает то, что в коде с варнингами борюсь, а тут придется глаза закрывать.
Вам шашечки или ехать.
V> И еще, из опыта, всегда стараюсь избегать вещей которые зависят от порядка включения заголовков или библиотек. В будущем очень легко случайно поменять порядок и получить не рабочую dll в инсталяторе.
Не очень понимаю причем тут инсталятор. Но порядок не поменяется если явно указать объектник с подменой как первый параметр у link