2008-10-21 5 views
3

Я выяснил, как установить VC++ для компиляции кода в .lib-файл, а не в .exe, но у меня возникли проблемы с получением lib для связи вместе с моим другим .obj файлы.Не удалось связать статическую библиотеку C++

Вот как у меня установлена ​​библиотека и папки приложений. (Я не уверен, если это правильно)

AppFolder 
    App.sln 
    App.ncb 
    *.h 
    *.cpp 
    Debug 
    *.obj 
    App.exe 

и где-то на жестком диске ...

LibraryFolder 
    lib 
    Library.lib 
    include 
    LibrarySolutionFolder 
     Library.sln 
     Library.ncb 
     *.h 
     *.cpp 
     Debug 
     *.obj 
     Library.lib 

Я #including библиотеку * .h файлы из моего приложения cpp-файлы, и все компилируется отлично. Просто, когда он связывается, я получаю список всех файлов .lib , которые ищутся, а Library.lib не существует, хотя я их перечислял в каталогах VC++. Как это сделать? (И я структурировать папки библиотеки правильно?)

ответ

10

О свойствах проекта:

Configuration Properties -> Linker -> Input -> Дополнительные зависимостями

Добавьте его там.

Или в вашем .h файл для библиотеки, добавьте:

#pragma comment(lib, "Library") 

Это будет делать это автоматически.

+0

Спасибо, теперь он работает – jeffythedragonslayer 2008-10-21 23:40:43

0

VC не просто связывает библиотеку, если вы включаете заголовочный файл.

Вы должны указать компоновщику, чтобы использовать библиотеку. По уважительным причинам: у вас есть тысячи библиотек в вашей библиотеке. Если MSVC пришлось искать все из них каждый раз, когда вы связываете свою программу, ему придется пробираться через мегабайты данных.

Это займет довольно много времени, поэтому по умолчанию оно не выполняется.

Для VC вы также можете дать подсказку компоновщику внутри вашего источника. Для этого вы добавляете следующую строку в исходный код (заголовок библиотеки может быть хорошим местом).

#pragma comment(lib,"c:\\path_to_library\\libname.lib") 

Это не независимая от платформы, но наиболее удобный способ получить lib, автоматически связанный с проектом с использованием MSVC.

Другой способ - просто добавить компоновщик в настройки проекта. В соответствующей информации можно найти параметры компоновщика вашего проекта. Не забудьте добавить lib в конфигурации выпуска и отладки.

+2

Использование #pragma comment (lib, ...) с абсолютными путями больше, чем просто для компилятора. Он «зависит от вашей машины» (если только это не относится к «подводу» или сопоставлению сетевого диска). Вариант пути поиска компоновщика -L лучше (для #include и -I). Но эй, это «Работает на моей машине». – bk1e 2008-10-22 03:34:31

+0

Я думал, что это очевидно, например, bk1e. Вы действительно думаете, что у меня есть каталог с именем «path_to_library» на моем диске? * head hits table * – 2008-10-22 06:58:48

3

Каталоги VC++ - это список мест расположения каталогов для поиска во время компоновки. Это не список библиотек, которые будут связаны.

Вам нужно добавить Lib файл в Дополнительные зависимостями поле настроек по проекта Linker.

1

Чтобы связать с библиотекой, вы можете:

  • Список его в Проект-> Свойства ...-> Linker, вход-> Дополнительные зависимости (VC++ каталоги только позволяет использовать только. lib name, а полный путь),
  • Добавить проект библиотеки в ваше приложение. (В решении, щелкните правой кнопкой мыши -> Добавить -> Существующий проект ...), затем используйте Project -> Project Dependancies ..., затем проверьте проект библиотеки (убедитесь, что проект приложения выбран в раскрывающемся списке). Вероятно, это лучший способ, если вы редактируете оба проекта, поскольку VC++ перестраивает библиотеку, если она изменилась, прежде чем создавать приложение.
  • Если вы уверены, что вы будете использовать только VC++,

    #pragma comment(lib,"C:\\path\\to\\library.lib")` 
    

    (спасибо @Nils)

NB: Это кажется очень странным иметь папку решение библиотеки внутри 'включить' directory: которые действительно предназначены для * .h (или других файлов #include d).

1

Из командной строки:

кл/EHsc {objfiles} +/ссылка /LIBPATH: LibraryFolder Library.lib

где {objfiles} + означает один или несколько объектов или CPP файлы.

Смежные вопросы