Ссылка статический член из dll - PullRequest
0 голосов
/ 19 декабря 2011

У меня странная проблема со связыванием статического члена из dll с использованием Visual Studio Express 2010. На платформе Linux и MSYS / MinGW (GCC) этот сбой не происходит.

У меня есть математическая библиотека, явно использующая макрос экспорта для этого библиотечного модуля:

#ifdef WIN32
  #ifdef MATH_LIBRARY_EXPORT
    #define MATH_LIBRARY_API __declspec(dllexport)
  #else
   #define MATH_LIBRARY_API __declspec(dllimport)
  #endif
#else
  //define empty values for linux OS
  #define MATH_LIBRARY_API
#endif

А это фрагмент моего класса Vector, который я экспортирую со статическими элементами:

ifndef BINREV_VECTOR_H__
#define BINREV_VECTOR_H__

// include common header with dll import/export macro
#include <brMath/brCommons.h>

namespace binrev{
namespace brMath{

class MATH_LIBRARY_API brVector3f
{  
  public:
  float m_fX, m_fY, m_fZ;

  brVector3f(void);
  brVector3f(float x, float y, float z);

  ...

  public:
  static const brVector3f ZERO;
  static const brVector3f NEGATIVE_UNIT_Z;
  ...
};

и модуль cpp:

// Ensure that the dll hader will be exported
#define MATH_LIBRARY_EXPORT
#include <brMath/brVector3f.h>

namespace binrev{
namespace brMath{

const brVector3f brVector3f::ZERO(0.0f, 0.0f, 0.0f);
const brVector3f brVector3f::NEGATIVE_UNIT_Z( 0.0f, 0.0f, -1.0f);

...

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

#include <brMath/brVector3f.h>

brMath::brVector3f brCamera::getDirection(void)
{
   return  m_orientation.rotate(brMath::brVector3f::NEGATIVE_UNIT_Z);
}

На других платформах все работает хорошо, но с MVSE 2010 я получил сбой компоновщика:

1>------ Erstellen gestartet: Projekt: ZERO_CHECK, Konfiguration: Debug Win32 ------
2>------ Erstellen gestartet: Projekt: brGraphics, Konfiguration: Debug Win32 ------
2>  brCamera.cpp
2>brCamera.obj : error LNK2001: Nicht aufgelöstes externes Symbol ""public: static   class binrev::brMath::brVector3f const binrev::brMath::brVector3f::NEGATIVE_UNIT_Z"  (?NEGATIVE_UNIT_Z@brVector3f@brMath@binrev@@2V123@B)".
2>C:\binrev\repository\binrevengine\modules\brGraphics\trunk\bin\brGraphics.dll : fatal error LNK1120: 1 nicht aufgelöste externe Verweise.
========== Erstellen: 1 erfolgreich, Fehler bei 1, 0 aktuell, 0 übersprungen ==========

Я не друг MVSE, и это моя первая попытка запустить наш код с MVSE. Хотя у меня есть разные решения, я добавил brMath.lib в качестве дополнительной зависимости в настройках проекта. Я также установил путь к каталогу дополнительной библиотеки к местоположению моего brMath.lib. Это вывод команды компоновщика для просмотра моих настроек:

/OUT:"C:\binrev\repository\binrevengine\modules\brGraphics\trunk\bin\brGraphics.dll"    /INCREMENTAL /NOLOGO
/LIBPATH:"C:\binrev\repository\binrevengine\modules\brMath\trunk\lib\Debug" /DLL   "kernel32.lib" "user32.lib" "gdi32.lib"
"winspool.lib" "shell32.lib" "ole32.lib" "oleaut32.lib" "uuid.lib" "comdlg32.lib"    "advapi32.lib" "brCore.lib" "brMath.lib"
"c:\binrev\development\vs2010\VC\lib\libboost_signals-vc100-mt-gd-1_47.lib" "c:\binrev \development\vs2010\VC\lib\libboost_system-vc100-mt-gd-1_47.lib"
/MANIFEST /ManifestFile:"brGraphics.dir\Debug\brGraphics.dll.intermediate.manifest"   /ALLOWISOLATION
/MANIFESTUAC:"level='asInvoker' uiAccess='false'" /DEBUG /PDB:"C:\binrev\repository  \binrevengine\modules\brGraphics\trunk\bin\brGraphics.pdb"
/SUBSYSTEM:CONSOLE /STACK:"10000000" /PGD:"C:\binrev\repository\binrevengine\modules\brGraphics\trunk\bin\brGraphics.pgd" /TLBID:1
/DYNAMICBASE /NXCOMPAT /IMPLIB:"C:/binrev/repository/binrevengine/modules/brGraphics  /trunk/lib/Debug/brGraphics.lib" /MACHINE:X86 /ERRORREPORT:QUEUE

Мне тоже кажется, что что-то связано правильно. Когда я удаляю вызов const static dll члена brVector3f, сборка проходит успешно. Я думаю, что должна быть проблема с постоянным статическим членом. Но почему в аду только с MVSE?

Я не смог найти никакой разницы с этим введением: http://stackoverflow. .. c-data-in-a-dll Так что обычно должно работать ...

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

1 Ответ

1 голос
/ 20 декабря 2011

"... При изменении переменной или функции в области действия файла ключевое слово static указывает, что переменная или функция имеет внутреннюю связь (ее имя не видно снаружи файла, в котором она объявлена)." от MSDN

...