Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Программирование и базы данных (http://forum.oszone.net/forumdisplay.php?f=21)
-   -   Линкование (http://forum.oszone.net/showthread.php?t=42942)

mrcnn 24-12-2004 03:01 282830

Линкование
 
При линковании исходников требуется опр. библиотеки. Достаточно ли их скопировать в директорию lib прописанную в переменных средах, и указать в списке необходимых lib в командной строке после link, чтобы проект был построен правильно? если нет, то почему могут возникнуть ошибки типа LNK2001 unresolved external symbol __imp__имя функции, причем функции есть в библиотеке указанной в командной строке


И еще один вопрос: с помощью какой программы можно построить проект в котором присутствует файл sources(примерное содержание ниже), в makefile указана ссылка на этот файл
Содержание примерно следующее:
Код:


TARGETNAME=Name
TARGETPATH=obj
TARGETTYPE=MINIPORT

AXP64_FLAGS=/QA21164

INCLUDES=..\inc;..\..\inc

MSC_WARNING_LEVEL=-W4 -WX
MSC_OPTIMIZATION =-0xs

LINKER_FLAGS=/DEF:Name.def /MERGE:.rdata=.data

CBSTRING=;

DDKLIBPATH=$(BASEDIR)\LIB\W2K\i386

TARGETLIBS=$(DDKLIBPATH)\ntoskrnl.lib $(DDKLIBPATH)\hal.lib

SOURCES=ac97.cpp          \
        calloc.cpp        \
        bpr.cpp            \
<...>
        cmd_unhook.cpp    \
        name.rc         

DLLDEF=Name.def


hasherfrog 24-12-2004 23:10 283169

Цитата:

Достаточно ли их скопировать в директорию lib прописанную в переменных средах, и указать в списке необходимых lib в командной строке после link, чтобы проект был построен правильно?
Да, если я всё правильно понял в вопросе.

Цитата:

если нет, то почему могут возникнуть ошибки типа LNK2001 unresolved external symbol __imp__имя функции, причем функции есть в библиотеке указанной в командной строке
Может, где-то не хватает extern C?

Цитата:

с помощью какой программы
Похоже на "ручную работу".

mrcnn 25-12-2004 11:50 283306

В ac97.cpp написано:
Код:

extern "C" {
#pragma warning ( push, 3 )
#include "ntddk.h"
#pragma warning ( pop )
}

В ntddk.h функция описана:
Код:

NTKERNELAPI
PVOID
MmAllocateContiguousMemory (
    IN SIZE_T NumberOfBytes,
    IN PHYSICAL_ADDRESS HighestAcceptableAddress
    );

Файл ntoskrnl.lib при линковании указан.

Но выдается ошибка ac97.obj: error LNK2001: unresolved external symbol __imp__MmAllocateContiguousMemory

В чем может быть причина?Может быть ошибка вызвана неправильной компиляцией, например указаны какие-нибудь лишние флаги при компилировании? Компилируется весь проект вручную в командной строке с помощью cl.exe с указанием всех исходников и с параметрами /nologo /W3 /GX /O2 /D 'WIN32' /D '_WINDOWS' /D '_MBCS' /YX /FD /c
Ошибки на этом этапе не выдаются.
Линкуется сразу весь проект.

hasherfrog 25-12-2004 19:04 283379

Мммм. А как насчёт /link /defaultlib:ntoskrnl.lib ???

mrcnn 25-12-2004 21:17 283408

Нет. Не работает.


Savant 30-03-2005 05:05 311296

mrcnn, ты решение еще не добыл? :)
У меня тут похожая ситуация, возникла... при подключении сторонних (чужих) классов проявляется (причем классов хоть визуальных (наследники MFC), хоть нет). В настройках проекта всё уже перелопатил, extern "c" пробовал, основные и некоторые другие библиотеки подключать, осталось только все библиотеки что есть (406 штук) попереподключать... тока влом. :)

например при линковке с CMarkup классом:
error LNK2001: unresolved external symbol "public: bool __thiscall CMarkup::SetDoc(char const *)" (?SetDoc@CMarkup@@QAE_NPBD@Z)
fatal error LNK1120: 1 unresolved externals

а при линковке с CSplitterControl:
error LNK2001: unresolved external symbol "public: __thiscall CSplitterControl::CSplitterControl(void)" (??0CSplitterControl@@QAE@XZ)
error LNK2001: unresolved external symbol "public: virtual __thiscall CSplitterControl::~CSplitterControl(void)" (??1CSplitterControl@@UAE@XZ)
fatal error LNK1120: 2 unresolved externals

Даже не понятно, куда копать


Время: 18:44.

Время: 18:44.
© OSzone.net 2001-