2016-03-23 2 views
0

Я использую Visual Studio, и я работаю над C++ код, который работает, как это в классе A:dllexport методы статического класса

class A 
{ 
public: 
    //...... 
    static void foo(); 
}; 

класса B экспортируется:

class __declspec(dllexport) B 
{ 
public: 
    //... 
    void bar() 
    { 
     A::foo(); 
    } 
}; 

A и B являются скомпилирован в AB.dll (и AB.lib). Сейчас основная программа:

int main() 
{ 
    B b; 
    b.bar(); 
    return 0; 
} 

When compiling the main program and linking it to AB.lib, 
it complains about the A::foo() as unresolved external symbol 
(in this case A::foo is a static function). 
Do I need to somehow export A::foo() or could it be that 
I introduce errors somewhere? Any help is appreciated. 

Modified: 
1) Sorry for the type, it should be dllexport, not dllimport 
2) in my actual project, the implementation is in .cpp files. They are not inline functions. 
Thanks. 
+0

Ответы на http://stackoverflow.com/questions/35048940/what-does-this-c-class-declaration-mean могут быть полезны. –

+0

Поместите реализацию 'B :: bar' в исходный файл, не экспортируйте его. Если 'A' используется только в источнике' B', его не нужно экспортировать. –

+1

Вы даете компоновщику два пути для разрешения B :: bar(). Он может использовать определение из файла .h или использовать его в AB.lib. Это предрешено, он всегда будет похож на файл .h, поскольку он присутствует в файле .obj. Теперь нужно разрешить A :: foo(). Неудачный кит, AB.lib его не имеет. Вы должны удалить определение в файле .h и перенести его в файл .cpp, чтобы компилятор не мог его использовать. –

ответ

0

Я предполагаю, что код показал в файле заголовка .h, а затем, когда заголовок файла говорит:

class __declspec(dllimport) B 
{ 
public: 
    //... 
    void bar() 
    { 
     A::foo(); 
    } 
}; 

Во-первых: вы говорите, B класс IMPORTED, он работает для вашего основного приложения, но не работает для вашей DLL.

Второе: B :: бар() не импортируется из DLL, а непосредственно ВЫПОЛНЕНА в главном APP (компилятор readding непосредственно в файле заголовка, и он не пытается импортировать из библиотеки DLL)

Рекомендации:

ПЕРВЫЙ: переопределять файл заголовка, как это:

class __declspec(dllimport) B 
{ 
public: 
    //... 
    void bar(); 
}; 

и реализовать метод B :: бар в CPP файле в длл проекта

SECOND: удалить класс A из файла заголовка (если можно)

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