From ee727667975ccac39a74386ab7c55984165220b6 Mon Sep 17 00:00:00 2001 From: Thomas Beutlich Date: Wed, 29 Jan 2025 21:16:29 +0100 Subject: [PATCH] refs #52: Test and fix MSVC linker error on duplicated symbols --- ExternData/Resources/BuildProjects/CMake/test.cmake | 4 ++++ ExternData/Resources/Include/msvc_compatibility.h | 4 ++-- ExternData/Resources/Test/Test_Linkage.c | 9 +++++++++ ExternData/Resources/Test/Test_Linkage.cc | 10 ++++++++++ 4 files changed, 25 insertions(+), 2 deletions(-) create mode 100644 ExternData/Resources/Test/Test_Linkage.c create mode 100644 ExternData/Resources/Test/Test_Linkage.cc diff --git a/ExternData/Resources/BuildProjects/CMake/test.cmake b/ExternData/Resources/BuildProjects/CMake/test.cmake index 2363c23..50c4640 100644 --- a/ExternData/Resources/BuildProjects/CMake/test.cmake +++ b/ExternData/Resources/BuildProjects/CMake/test.cmake @@ -46,6 +46,8 @@ if(EXISTS "${ED_TEST_DIR}") foreach(TEST ${ED_TESTS}) add_executable(${TEST} "${ED_TEST_DIR}/${TEST}.cc" + "${ED_TEST_DIR}/Test_Linkage.cc" + "${ED_TEST_DIR}/Test_Linkage.c" "${ED_TEST_DIR}/Constants.h" ) target_compile_features(${TEST} PRIVATE cxx_std_17) @@ -73,6 +75,8 @@ if(EXISTS "${ED_TEST_DIR}") ) if(UNIX) list(APPEND ED_ALL_LIBS m) + elseif(MSVC) + target_link_options(${TEST} PRIVATE "/FORCE:MULTIPLE") endif() target_link_libraries(${TEST} PRIVATE ${ED_ALL_LIBS}) diff --git a/ExternData/Resources/Include/msvc_compatibility.h b/ExternData/Resources/Include/msvc_compatibility.h index 777f2c7..2538436 100644 --- a/ExternData/Resources/Include/msvc_compatibility.h +++ b/ExternData/Resources/Include/msvc_compatibility.h @@ -23,14 +23,14 @@ extern "C" { #endif -extern long timezone = 0; +__declspec(selectany) extern long timezone = 0; #if defined(G_HAS_CONSTRUCTORS) #ifdef G_DEFINE_CONSTRUCTOR_NEEDS_PRAGMA #pragma G_DEFINE_CONSTRUCTOR_PRAGMA_ARGS(Timezone_initialize) #endif G_DEFINE_CONSTRUCTOR(Timezone_initialize) -static void Timezone_initialize(void) { +static inline void Timezone_initialize(void) { _get_timezone(&timezone); } #endif diff --git a/ExternData/Resources/Test/Test_Linkage.c b/ExternData/Resources/Test/Test_Linkage.c new file mode 100644 index 0000000..d2afe32 --- /dev/null +++ b/ExternData/Resources/Test/Test_Linkage.c @@ -0,0 +1,9 @@ +/* Test_Linkage.c + * + * Copyright (C) 2015-2025, Thomas Beutlich + * All rights reserved. + * + * SPDX-License-Identifier: BSD-2-Clause + */ + +#include "../Include/msvc_compatibility.h" diff --git a/ExternData/Resources/Test/Test_Linkage.cc b/ExternData/Resources/Test/Test_Linkage.cc new file mode 100644 index 0000000..c538523 --- /dev/null +++ b/ExternData/Resources/Test/Test_Linkage.cc @@ -0,0 +1,10 @@ +/* Test_Linkage.cc + * + * Copyright (C) 2015-2025, Thomas Beutlich + * All rights reserved. + * + * SPDX-License-Identifier: BSD-2-Clause + */ + +#include "../Include/msvc_compatibility.h" +#include "Constants.h"