Как использовать глобальную переменную, которая определена в других DLL? - PullRequest
0 голосов
/ 19 января 2020

У меня есть globalInfo.dll для

Исходный файл:

#include "util/timer.h"
#include "util/winDll.h"
namespace GLOBAL
{
    DLL_EXPORT timer::timestamp currentTime;
    DLL_EXPORT timer globalTimer;
    static void timerAction (uint64_t nowTime, void* nptr)
    {
        currentTime.time = nowTime;
    }
    DLL_EXPORT void init()
    {
        currentTime.time = timer::getNowTimestamp();
        globalTimer.start();
        globalTimer.addTimer(nullptr, timerAction, 1000000);
    }
    DLL_EXPORT void close()
    {
        globalTimer.stop();
    }
}

Заголовочный файл:

#pragma once
#include "util/timer.h"
#include "util/winDll.h"
namespace GLOBAL
{
    DLL_IMPORT extern timer::timestamp currentTime;
    DLL_IMPORT extern timer globalTimer;
    constexpr static auto version = "0.1.0";
    DLL_EXPORT void init();
    DLL_EXPORT void close();
}

Я использую currentTime в других dll с :

now.time = GLOBAL::currentTime.time;

Это проект CMake, я использую TARGET_LINK_LIBRARIES для связи globalInfo. На Linux платформе все в порядке, но на Windows Visual Studio 2019 я получил ошибку LNK2001:

**struct timer::timestamp GLOBAL::currentTime" (?currentTime@GLOBAL@@3Utimestamp@timer@@A)**

My CMakeLists.txt:

aux_source_directory(database databaseDir)
add_library(database SHARED ${databaseDir})
TARGET_LINK_LIBRARIES(database  util globalInfo thread memory meta ${LZ4} ${GLOG} ${GFLAGS})
target_include_directories(database PUBLIC ${BASE_INCLUDE_PATH} ${GLOG_INCLUDE_PATH} ${GLFAG_INCLUDE_PATH})
...