Заполнение TListBox
[COLOR=darkblue][Linker error] Unresolved external <здесь имя функции> referenced from <здесь имя OBJ-файла>[/COLOR].
Я уже 20 раз всё проверил, но безрезультатно... Может, кто знает, в чем тут дело?
Хм... я, вроде, разобрался с функциями WinAPI, и библиотека нормально скомпилировалась, но при компиляции главного приложения, использующего библиотеку, Builder пишет:
[COLOR=darkblue][Linker error] Unresolved external <здесь имя функции> referenced from <здесь имя OBJ-файла>[/COLOR].
Я уже 20 раз всё проверил, но безрезультатно... Может, кто знает, в чем тут дело?
Вот справка по этой ошибке из Билдера, к сожалению в этом не сильно селён, так что переводи и смотри
Specialized SCL String and Stream classes and Unresolved Externals Error messages
Syntax
#define _RWSTD_COMPILE_INSTANTIATE
Description
In order to reduce object file size and improve link times,some specialized SCL stream and string classes exist in the current RTL (Runtime Library). The system used to achieve this separation results in the compiler being unable to generate template instantiations for certain string and stream classes. To work around this, it is necessary to define _RWSTD_COMPILE_INSTANTIATE prior to including the SCL string and stream class header files. This should only be necessary if you are attempting to use an SCL based string or stream class based on a type other than char and wchar_t.
Example
#define _USE_OLD_RW_STL
#define _RWSTD_COMPILE_INSTANTIATE
#include <string>
#include <iostream>
//using std::string;
using std::cout;
using std::endl;
typedef std::basic_string<unsigned char> u_string;
#pragma argsused
int main(int argc, char* argv[])
{
u_string s((unsigned char *)"Test");
cout << s.c_str() << endl;
return 0;
}
В конце написано (перевожу дословно): Это необходимо, если вы пытаетесь использовать строковые типы SCL или поточные классы, основанные не на char или wchar_t.
Моя библиотека использует только char для работы со строками. Так что проблема остается. Может, кто знает, в чем дело?
Хм... я, вроде, разобрался с функциями WinAPI, и библиотека нормально скомпилировалась, но при компиляции главного приложения, использующего библиотеку, Builder пишет:
[COLOR=darkblue][Linker error] Unresolved external <здесь имя функции> referenced from <здесь имя OBJ-файла>[/COLOR].
Я уже 20 раз всё проверил, но безрезультатно... Может, кто знает, в чем тут дело?
так он пишет только в том случае, если шдалвное приложение видит описание функции - Н-файл DLL и компилятор все нормально компилирует, а при компоновке линкер не находит реализацю функции. Реализацию он ищет либо о обьектных модулях проекта, либо в подключенных Lib'ах. Иначе нигде, по-моему. Ты точно добавил к главному проекту Lib-файл от DLL?
так он пишет только в том случае, если шдалвное приложение видит описание функции - Н-файл DLL и компилятор все нормально компилирует, а при компоновке линкер не находит реализацю функции. Реализацию он ищет либо о обьектных модулях проекта, либо в подключенных Lib'ах. Иначе нигде, по-моему. Ты точно добавил к главному проекту Lib-файл от DLL?
Да, всё добавил и 30 раз проверил - безрезультатно....
Да, всё добавил и 30 раз проверил - безрезультатно....
дак ты напиши хоть что за функция, чтоб проверить можно было
дак ты напиши хоть что за функция, чтоб проверить можно было
Ну вот смотри:
1. Код DLL.cpp
#include <windowsx.h>
#include "DLL.h"
#pragma argsused
int WINAPI DllEntryPoint(HINSTANCE hinst, unsigned long reason, void* lpReserved)
{
return 1;
}
// Функция для заполнения ListBox'ов
void FillListBoxes ( char *UserName, HWND List1, HWND List2 )
{
for ( int i = 0; i < 100; i++ )
{
ListBox_AddString ( List1, &UserName );
ListBox_AddString ( List2, &UserName );
}
}
2. Код DLL.h
#define __EXPORT_TYPE __export
#else
#define __EXPORT_TYPE __import
#endif
void __EXPORT_TYPE FillListBoxes ( char *UserName, HANDLE List1, HANDLE List2 );
3. Ну и, наконец, в вызывающем приложении:
#include "DLL.h"
...
void __fastcall TForm1::Button1Click(TObject *Sender)
{
FillListBoxes ( "Vasya", ListBox1->Handle, ListBox2->Handle );
}
Такой простой код не работает. В чем проблема?
кто же так делает?
ты определись. или ты длл используешь
или импортируешь функцию себе...
я, конечно, не спец, но...
вариант 1.
- подключаешь h файл,
- при линковке функция должна выдёргиваться
и вставляться в твой объектный файл,
- всё это дело компилируется.
вариант 2.
- подключаешь библиотеку (стат., дин.)
- вызываешь нужную функцию оттуда
то, что ты написал, похоже на вариант 1,
только тело функции не импортируется, ибо
нету... соответственно косяк: прототип есть,
а вызывать нечего.
ну дак у тебя всё нахрен неправильно
кто же так делает?
ты определись. или ты длл используешь
или импортируешь функцию себе...
я, конечно, не спец, но...
не стоит так громко выражаться я таком случае. Функция DLL не компилируется в обьектный файл - в чем смысл тогда мспользовать DLL.
А в этом случае действительно Unresolved external reference, я бы на месте компилятора тоже так сказал :-))) функция обьявленная в DLL.cpp это локальная функция DLL, ее не будет видно снаружи. В H-файле она оьявлена как __export а в СРР-файле нет - естественно она не будет экспортироваться - это, фактически две разные функции, точнее одна -локальная и прототип второй экспортной, но без тела
чувак сделал дээлэлину, а пытается функцию включить в свой объектный файл, в чем смысл - я сам его не понял.
извините, если непонятно выразился.
но он не пытается встроить ничего в обьектник - по крайней мере в том коде которой написан. Главное приложение включит файл DLL.h в котром макрос __BUILDING_THE_DLL по идее не должен быть определен и поэтому функция будет __import и приложение будет искать ее в подключенных к проекту LIB'ах, а в LIB'ах ее нет, потому чтопри компоновке DLL она не вола в раздел экспорт.
Это правильный код, толлько нужно проследить чтобы в главном приложении не был определем макрос __BUILDING_THE_DLL и в файле DLL.cpp при реализации функции дописать __EXPORT_TYPE и все должно работать (у меня в таких случаях работает :-)))
либами я пользоваться не умею :(
Действительно, я сделал тупую ;) ошибку и не замечал её в течение очень долгого времени. Спасибо, что на свете есть более внимательные люди. ;)