удалить символ .lib-файла, если он уже существует в Windows с Visual C ++ - PullRequest
0 голосов
/ 17 марта 2011

Можно ли отказаться от уже существующих символов файла .lib при связывании с исходным кодом?

Например, у меня есть файл .lib, скомпилированный с несколькими исходными файлами, и файл source1.cpp , содержащий функцию: void function1 () .
У меня есть проект, содержащий несколько файлов, и один из его файлов такой же source1.cpp (поэтому содержит также те же функции), но который был изменен.
Так можно ли связать файл lib с моим проектом, чтобы принять во внимание исходный файл и функции моего проекта вместо функций файла .lib?

Я бы хотел сделать это с помощью Visual C ++.
В данный момент, когда я это делаю, получаю общую ошибку , символ уже определен ...

Спасибо за вашу помощь

Ответы [ 2 ]

1 голос
/ 18 марта 2011

Этого не должно быть, .obj в .lib вытягивается только тогда, когда это необходимо.Попробуйте, например, написать в своем коде strcpy (), без ссылки, даже если она присутствует в библиотеке CRT.

Убедитесь, что вам не нужны некоторые функцийв source1.obj, который хранится в .lib.Вы диагностируете это, используя параметр / verbose linker.Проект + Свойства, Линкер, Командная строка, Окно дополнительных опций.Он показывает вам, какие символы извлекаются из .lib, ищите source1.obj.Как только он будет использован, вы do получите ошибку компоновщика, если произойдет конфликт имен.Это, конечно, подвержено ошибкам и лучше избегать.

0 голосов
/ 17 марта 2011

Нет. Вы должны сделать символы отличными. То есть function1 в вашем проекте source1.cpp должно иметь имя, отличное от имени в вашей библиотеке.

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

// lib/source1.h
namespace mylib {
  void function1();
}

// lib/source1.cpp
namespace mylib {
  void function1() {
    ...
  }
}

// project/source1.h
namespace myproj {
  void function1();
}

// project/source1.cpp
namespace myproj {
  void function1() {
    ...
  }
}

Теперь в своем коде вы можете позвонить myproj::function1() или mylib::function1(). Эти символы будут отличаться. Если вы всегда используете одно, а не другое, компоновщик, вероятно, откажется от того, который не используется (по крайней мере, в оптимизированной сборке).

Если вы не хотите изменять все вызовы в своем коде, вы можете добавить строку типа using myproj::function1(), которая сообщит компилятору, что когда вы говорите function1(), вы подразумеваете тот из вашего проекта.

...