Запретить Visual Studio экспортировать функцию в статическую библиотеку - PullRequest
1 голос
/ 31 октября 2011

Странный вопрос: я собираю статическую библиотеку с помощью Visual Studio и использую исходный файл со списком служебных функций, которые я также использую в исполняемом проекте, который импортирует статическую библиотеку. В результате я получаю такие ошибки:

4>newfuncs.lib(util.obj) : error LNK2005: _shift_left already defined in util.obj
4>newfuncs.lib(util.obj) : error LNK2005: _chop already defined in util.obj
4>newfuncs.lib(util.obj) : error LNK2005: _crc_begin already defined in util.obj
4>newfuncs.lib(util.obj) : error LNK2005: _crc_update already defined in util.obj
4>newfuncs.lib(util.obj) : error LNK2005: _crc_result already defined in util.obj
4>newfuncs.lib(util.obj) : error LNK2005: _strtok_r already defined in util.obj

Кто-нибудь знает, как я могу выяснить, как заставить Visual Studio НЕ экспортировать функции в util.obj, поскольку они изначально присутствуют в реальном исполняемом проекте.

Ответы [ 2 ]

1 голос
/ 28 января 2012

Итак, разобрались: если вы используете выражение pragma, оно интегрирует функции в вашу статическую библиотеку.В моем случае я поместил:

#pragma comment(lib, "libev.lib")

в заголовок, и он импортировал libev в мою библиотеку.Теперь, когда я действительно написал свой исполняемый файл, мне нужно было только связать свою библиотеку: никакой дополнительной libev зависимости не было.

1 голос
/ 31 октября 2011
  • Простой ответ - перетащить функции из util.obj в их собственную библиотеку и связать вашу библиотеку и исполняемый файл с ней.
  • Если вам нужны только служебные функции в одном исходном файле, вы можете переместить их в файл .c и объявить их статическими, тогда они не будут иметь никакой связи вне файла, в котором они определены.
  • Если вы действительно хотите сделать это, не экспортируя символы, пометьте функцию с помощью __declspec(selectany), которая скажет VS, что несколько определений функции эквивалентны, и вы можете свободно выбирать, что ей нравится (убедитесь, что они на самом деле то же самое!).
...