2012-01-16 3 views
0

Я хочу написать dll для api устройства. так как я новичок в dlls, я хотел реализовать его в простом текстовом редакторе, а затем сделать его для api. Я сделал файл заголовка и файл cpp, но когда я запускаю код, я получаю сообщение об ошибке lnk2001, за которым следует lnk1120, который является нерешенной внешней ошибкой.Ошибка компоновщика DLL C++

Я действительно не знаю, где я сделал ошибку, насколько я вижу, я сделал это правильно. Мне было интересно, могли бы вы, ребята, помочь мне. Тпй.

вот мой файл заголовка

// EditFuncsDll.h 
#include <cstdio> 
#include <vector> 
#include <string> 

namespace EditFuncs 
{ 
    class MyEditFuncs 
{ 
private: 
    static std::vector<std::string> MyTextBox; 

public: 
    static __declspec(dllexport) void Load(std::string command); 
    static __declspec(dllexport) void Save(std::string command); 
    static __declspec(dllexport) int Lines(); 
    static __declspec(dllexport) void Add(std::string command); 
    static __declspec(dllexport) void Remove(std::string command); 
    static __declspec(dllexport) void Insert(std::string command); 
    static __declspec(dllexport) int wc(std::string command); 
    static __declspec(dllexport) void GetInfo(); 
}; 
} 

и в моем файле CPP я просто определить функции я объявленным в заголовочном файле.

и эти ошибки я получаю

Ошибки 25 Ошибка LNK2001: неразрешенный внешний символ «частный: статический станд класса :: вектор, класс станд :: Распределитель>, класс станд :: распределитель, класс станд :: allocator>>> EditFuncs :: MyEditFuncs :: MyTextBox "(? MyTextBox @ MyEditFuncs @ EditFuncs @@ 0V? $ vector @ V? $ basic_string @ DU? $ char_traits @ D @ std @@ V? $ allocator @ D @ 2 @@ std @@ V? $ Allocator @ V? $ Basic_string @ DU? $ Char_traits @ D @ std @@ V? $ Allocator @ D @ 2 @@ std @@@ 2 @@ std @@ A) C: \ Users \ Люси \ Desktop \ Erfan \ Text_Editor_DLL \ Text_Editor_DLL \ EditFuncsDll.obj Text_Editor_DLL

и

Ошибка 26 Ошибка LNK1120: 1 неразрешенных внешних C: \ Users \ Люси \ Desktop \ Erfan \ Text_Editor_DLL \ Debug \ Text_Editor_DLL.dll Text_Editor_DLL

+0

@Assem, но я просто определение функции в файле CPP это Файл cpp заголовка не является основным cpp. Я не думаю, что я должен его определить. нужно ли мне? – Erfan

+0

, вы должны определить каждую статическую переменную-член, объявленную в соответствующем cpp. Просто напишите его перед определением ваших функций в файле .cpp. BTW, я должен исправить то, что я написал в предыдущем комментарии: std :: vector EditFuncs :: MyEditFuncs :: MyTextBox; – Assem

+0

@Assem вот часть моего cpp '// EditFuncsDll.cpp #include "EditFuncsDll.ч» #include #include использования патезраса; пространство имен EditFuncs { \t статического станд :: вектор MyTextBox; \t недействительного MyEditFuncs :: Load (командная строка) \t { \t \t строки filename; \t \t // Имя файла начинается с пятого символа команды и заканчивается файл name = command.substr (5, command.size()); \t \t ifstream inFile; \t \t inFile.open (filename); ' поэтому в соответствии с тем, что вы сказали, я добавил определение этой статической переменной, но все же получаю ту же ошибку. я не знаю, почему! – Erfan

ответ

1

Глава вашего CPP должен быть таким:

#include "EditFuncsDll.h" 
#include <iostream> 
#include <fstream> 
using namespace std; 
namespace EditFuncs 
{ 
    std::vector<std::string> EditFuncs::MyEditFuncs::MyTextBox; 
    void MyEditFuncs::Load(string command) 
    { 
     string filename; // The name of the file starts at the fifth character of the command and goes to the end 
     filename = command.substr(5,command.size()); 
     ifstream inFile; 
     inFile.open(filename); 
     . 
     . 
     . 
+0

OMG его работа: D спасибо. поэтому, когда я определяю статический член, я должен также определить его в соответствующем cpp. правильно? еще раз спасибо. – Erfan

+0

Это все @Erfan :) – Assem

0

в файле заголовка вашей DLL, вы можете использовать макрос препроцессора, который расширяется в __declspec(dllimport) для DLL клиентов и __declspec(dllexport) для кода, реализующего DLL (т.е. ваши DLL-файлы .cpp).

// EditFuncsDll.h 

#ifdef EDIT_FUNCS_DLL_IMPLEMENTATION 
#define EDIT_FUNCS_DLL __declspec(dllexport) // for DLL implementation 
#else 
#define EDIT_FUNCS_DLL __declspec(dllimport) // for clients 
#endif 

class EDIT_FUNCS_DLL MyEditFuncs 
{ 
... 
}; 

В исходном файле .cpp вашей DLL (ов), вы можете #define EDIT_FUNCS_DLL_IMPLEMENTATION перед тем #including вашего DLL заголовок:

// EditFuncsDll.cpp 

#define EDIT_FUNCS_DLL_IMPLEMENTATION 
#include "EditFuncsDll.h" 

// ... implementation code 
+0

Спасибо, на самом деле я не уверен, что именно делает dllimport. Я использовал msdn как мой учебник для dll, и иногда неясно, почему и когда я должен его использовать. Я ищу хороший учебник по dll, но не нашел его. и, кстати, код теперь успешно завершается, но когда я запускаю его, когда функции dll возвращаются, программа вылетает, и я не понимаю, почему ??? !!! может ли быть из этих макросов препроцессора? – Erfan

+0

@Erfan: Я бы предложил эти статьи из CodeProject: [Регулярный DLL Tutor для начинающих] (http://www.codeproject.com/Articles/6351/Regular-DLL-Tutor-For-Beginners) и [HowTo: Export C++ классы из DLL] (http://www.codeproject.com/Articles/28969/HowTo-Export-C-classes-from-a-DLL). Причины сбоев могут быть разными ... вы можете указать более подробную информацию (например, вы строите как EXE, так и DLL с помощью того же компилятора VC++ и того же CRT-вкуса?). –

+0

Да, я использую VS2011 для сборки DLL и .exe. Я создаю API для устройства. Большое спасибо за ссылки, я просто не мог найти интересных учебников. Это было либо слишком старым, либо просто Hello World DLL. – Erfan

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