2014-10-21 2 views
1

У меня есть два проекта VC++ внутри sln-файла в visual studio 2010. Я хочу использовать a_flag в файле другого проекта, возможно ли это, что я делаю ниже?ошибка LNK2001: нерешенный внешний символ

Проект 1:

**sample_header.h** 


#ifndef SAMPLE_HEADER_API 
#define SAMPLE_HEADER_API __declspec(dllimport) 
#endif 
extern SAMPLE_HEADER_API int a_flg; 

**file1.cpp** 
#define SAMPLE_HEADER_API __declspec(dllexport) 
#include "sample_header.h" 

// Intialization of external 
int a_flag = 15; 

void m_func() 
{ 
    int i = 0; 
} 

Проект 2:

**file2.h** 
#include <stdio.h> 

**file2.cpp** 
#include "file1.h" 
#include "sample_header.h" 

// provided path of "sample_header.h" in additional include directory as well 

void main() 
{ 
    if(a_flag > 0) 
    { 
    std::cout << "FLAG" ; 
    } 
}   

Я поставил project1 как DLL, проекта2 как проект EXE.

В связывании, я получаю эту ошибку:

error LNK2001: `unresolved external symbol "__declspec(dllimport) int a_flg" ([email protected]@3HA)` in file2.cpp 

Я прочитал Microsoft Страница here о создании DLL и ссылки, но не знаю, как решить эту внешнюю ошибку символа.

Спасибо!

+0

Вы связывая приложение с библиотекой импорта генерируемой с DLL? – drescherjm

+0

Также получите 'extern SAMPLE_HEADER_API int a_flg;' из ifdefs, поэтому он экспортируется в dll. – drescherjm

+2

Похоже, вы забыли добавить '.lib' из Project1 в линию ссылок Project2. –

ответ

1

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

Быстрое описание рычажной должно быть что-то вроде этого:

DLL зависимостей Project -> dependecy.dll + dependency.lib

Main Project -> зависит во время выполнения для depedency.dll, зависит в время ссылки на dependency.lib.

Другими словами, ваш .dll - это еще один двоичный код, который предоставляет некоторые сигнатуры функций.

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

При использовании 1-го подхода вам потребуется обработать внутри вашего кода, если вы не можете найти определенную DLL.

При использовании 2-го подхода ваш двоичный файл будет знать, что он зависит от определенного .dll, когда вы пытаетесь его запустить.

Вот ответ, который вы найдете очень полезным: How do I build an import library (.lib) AND a DLL in Visual C++?

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