«неразрешенный внешний символ» для функции без ссылок - PullRequest
0 голосов
/ 20 августа 2009

Я нахожусь в 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 ()).

Ответы [ 3 ]

1 голос
/ 20 августа 2009

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

0 голосов
/ 20 августа 2009

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

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

0 голосов
/ 20 августа 2009

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

...