2010-05-27 2 views
2

Почему он не загрузил библиотеку по ссылке во время компиляции? я не забочусь о том, чтобы освободить библиотеку, но она просто не сработает.Динамическая библиотека Ссылка на выполнение

#include <windows.h> 

    int main() 
    { 
     LoadLibrary("winmm.lib"); 
     timeGetTime(); 
    } 
+0

«Это не работает» не очень полезное описание проблемы. Пожалуйста, объясните, что * не работает, что вы пробовали и какие сообщения об ошибках отображаются, если они есть. – greyfade

+0

У меня возникла ошибка, которая говорит: «Ошибка LNK2019: неразрешенный внешний символ __imp__timeGetTime @ 0, указанный в функции _main» –

+0

сообщение об ошибке не говорит вам, что проблема LoadLibrary вызывает проблему, поэтому ваш вопрос не подходит. – YeenFei

ответ

3

.lib не динамически подключаемая библиотека (DLL), и не может быть загружен во время выполнения. Вам нужно загрузить .dll или связать .lib во время соединения (в этот момент вы не используете LoadLibrary).

+0

Я попытался загрузить LoadLibrary ("winmm.dll"); но это не сработает. –

2

Из вашего комментария выше ясно, что проблема в том, что timeGetTime() запрашивает модуль winmm во время компиляции, а это значит, что вам нужно связать с winmm.lib. Вы не можете вызвать функцию напрямую по ее имени, если хотите использовать привязку во время выполнения; вы должны получить указатель на функцию из DLL.

Если вы действительно хотите загрузить DLL во время выполнения, вы должны использовать GetProcAddress. Полный набор примерного кода для правильного использования LoadLibrary находится на этом MSDN page.

3

Попробуйте этот код. Он должен решить вашу проблему.

#include <windows.h> 

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

int main() 
{ 
    DWORD time = timeGetTime(); 
} 
+0

Хотя это не «Portable», мне нравится идея сохранять информацию о ссылках и собирать информацию близко друг к другу. – xtofl

1

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

  • Если вы хотите загрузить статическую библиотеку, вам необходимо сообщить компоновщику, чтобы ее включить - обратитесь к документации вашего компилятора об этом.
  • Чтобы загрузить динамическую библиотеку с использованием .lib-файла, вам необходимо сделать то же самое, что и для статической библиотеки, и поместить динамическую библиотеку в глобальную PATH или в ту же директорию, что и исполняемый файл.
  • Чтобы загрузить динамическую библиотеку во время выполнения, вам нужно вызвать LoadLibrary, чтобы получить ее, и передать ее GetProcAddress, чтобы получить указатели на интересующие вас функции. Wikipedia has a small example on how to do this.
Смежные вопросы