неразрешенный внешний символ для функции без ссылки

Я работаю в Visual Studio 2003. У меня есть функция в очень распространенном модуле, для которой требуются еще 3 модуля. Я хочу, чтобы только проекты, использующие новую функцию, включали 3 других модуля, а те, которые не ссылаются на функцию, должны связываться без ошибок «неразрешенного внешнего символа». Я пробовал связывание на уровне функций, OPT: REF и все настройки проекта, которые только мог придумать, но компоновщик всегда жалуется. Я сделал простой пример для тестирования. Любые идеи были бы потрясающими ...

//main.cpp
//#include "a.h"
int _tmain(int argc, _TCHAR* argv[])
{
  //a();
  return 0;
}

//a.h
#include "b.h"
void a();

//a.cpp
#include "a.h"
#include "b.h"
void a()
{
  b();
}

//b.h
void b();

//b.cpp
#include "b.h"
void b()
{
}

Мне нужно, чтобы проект компилировался нормально только с main.cpp и a.cpp в проекте, если a () никогда не вызывается. Если a () вызывается в _tmain (), тогда, конечно, в проект необходимо добавить b.cpp.

Компоновщик, похоже, не применяет OPT: REF до тех пор, пока не будет уверен, что КАЖДАЯ функция, на которую ссылаются ВЕЗДЕ, присутствует в проекте. Даже если на него (b ()) есть ссылка в функции, на которую нет ссылки (a ()).


person Cowtung    schedule 19.08.2009    source источник


Ответы (3)


У меня есть функция в очень распространенном модуле, для которой требуются еще 3 модуля. Я хочу, чтобы только проекты, использующие новую функцию, включали 3 других модуля, а те, которые не ссылаются на функцию, должны связываться без ошибок «неразрешенного внешнего символа».

Мне кажется, вам следует выделить эту новую функцию в другой модуль. (Не помещайте его в общий модуль). Таким образом, тот, кому это нужно, может включить его, а кто нет - нет. В противном случае вы застрянете с какими-то макросами условной компиляции, которые могут привести только к неприятностям.

person zdan    schedule 19.08.2009
comment
Я добавил функции шифрования / дешифрования в модуль string_utilities. Я полагаю, что монолитные модули, которые делают все, не идеальны. - person Cowtung; 20.08.2009
comment
Кроме того, я согласен с тем, что макросы условной компиляции не идеальны. - person Cowtung; 20.08.2009

Думали ли вы о создании библиотеки необязательной функции и трех зависимостей?

person Jay    schedule 19.08.2009
comment
Именно этим мы и займемся позже. Общий модуль, о котором я говорю, называется string_utilities.h, который используется повсеместно. Думаю, я надеялся, что есть простое решение, которое не потребует изменения тонны проектов. Что мне не нравится в библиотеках, так это то, что иногда вы можете столкнуться с другими проблемами из-за других настроек проекта и нежелательной почты. string_utilities.h / cpp должен был быть простой и быстрой вещью, включенной повсюду. - person Cowtung; 20.08.2009

Навскидку, окружение сомнительного вызова a () #ifdef, которое ищет что-то #defined рядом с b(), звучит многообещающе.

person VoteyDisciple    schedule 19.08.2009
comment
Я думал об этом, но мне нравится сводить предопределенный список к минимуму. Думаю, я надеялся, что мне не хватало какой-то настройки VS или функции С ++. - person Cowtung; 20.08.2009