title: Emscripten library make from CMake cannot link
body: <p>I am using Grassroot Dicom viewer version 2.8.9 to compile into Emscripten library bc on Windows 10 64-bit platform.</p>
  
  <p>I followed the instruction from this <a href="https://emscripten.org/docs/compiling/Building-Projects.html#detecting-emscripten-in-preprocessor" rel="nofollow noreferrer">website</a> </p>
  
  <pre><code>emconfigure cmake .
  emmake make VERBOSE=1
  </code></pre>
  
  <p>After that I got library file ending with .a instead of .bc similar to </p>
  
  <blockquote>
    <p>libgdcmcharls.a libgdcmCommon.a libgdcmDICT.a ....</p>
  </blockquote>
  
  <p>when I looked into the assembly code for each static library file it starts with</p>
  
  <p>! arch./</p>
  
  <p>instead of </p>
  
  <blockquote>
    <p>BC</p>
  </blockquote>
  
  <p>as mention in the tutorial <a href="https://emscripten.org/docs/compiling/Building-Projects.html#detecting-emscripten-in-preprocessor" rel="nofollow noreferrer">website</a> Note</p>
  
  <blockquote>
    <p>Some build systems may not properly emit bitcode using the above
    procedure, and you may see is not valid bitcode warnings. You can run
    file to check if a file contains bitcode (also you can manually check
    if the contents start with BC). It is also worth running emmake make
    VERBOSE=1 which will print out the commands it runs - you should see
    emcc being used, and not the native system compiler. If emcc is not
    used, you may need to modify the configure or cmake scripts.</p>
  </blockquote>
  
  <p>I think this is the problem that I cannot generate libraries with contents start with BC but instead I got ! arch ./ ?</p>
  
  <p>and of course those files cannot be linked from emcc ( cannot find reference error )</p>
  
  <pre><code>error: undefined symbol: _ZN4gdcm11ImageReader8GetImageEv
  error: undefined symbol: _ZN4gdcm11ImageReaderC1Ev
  error: undefined symbol: _ZN4gdcm11ImageReaderD1Ev
  error: undefined symbol: _ZN4gdcm5Trace14GetErrorStreamE
  </code></pre>
  
  <p>So I modified GDCM CMakefile.txt according to <a href="https://github.com/emscripten-core/emscripten/issues/3731" rel="nofollow noreferrer">this</a> </p>
  
  <pre><code>if (EMSCRIPTEN)
      set(CMAKE_AR "emcc" CACHE)
      set(CMAKE_STATIC_LIBRARY_SUFFIX ".bc")
      set(CMAKE_C_CREATE_STATIC_LIBRARY "&lt;CMAKE_AR&gt; -o &lt;TARGET&gt; &lt;LINK_FLAGS&gt; &lt;OBJECTS&gt;")
      set(CMAKE_CXX_CREATE_STATIC_LIBRARY "&lt;CMAKE_AR&gt; -o &lt;TARGET&gt; &lt;LINK_FLAGS&gt; &lt;OBJECTS&gt;")
  endif()
  </code></pre>
  
  <p>However, it does not help anything. The "make" still generates .a library files</p>
  
  <p>The command that I compiled my code as follows;  I also copy all .a files to the same folder as main.cpp</p>
  
  <pre><code>emcc -std=c++17 -O3 -s WASM=1  -s USE_WEBGL2=1 -s FULL_ES3=1 -s ALLOW_MEMORY_GROWTH=1 -o hello.html  -s "EXTRA_EXPORTED_RUNTIME_METHODS=['ccall', 'cwrap']" --no-heap-copy libgdcmcharls.a libgdcmCommon.a libgdcmDICT.a libgdcmDSED.a libgdcmexpat.a libgdcmIOD.a libgdcmjpeg12.a libgdcmjpeg16.a libgdcmjpeg8.a libgdcmMEXD.a libgdcmMSFF.a libgdcmopenjp2.a libgdcmzlib.a libgdcmuuid.a libsocketxx.a main.cpp ...........
  </code></pre>
  
  <p>The <a href="https://ufile.io/ecahv" rel="nofollow noreferrer">link</a> is my GDCM 2.8.9 library files. Compiled in Windows10 using 
  emcmake cmake and finally emmake make ( based on mingw32-make ). </p>
  
  <p>Here is my CMakeCXXCompiler.cmake  after calling emconfigure cmake .</p>
  
  <pre><code>set(CMAKE_CXX_COMPILER "C:/workspace/emsdk/emscripten/1.38.14/em++.bat")
  set(CMAKE_CXX_COMPILER_ARG1 "")
  set(CMAKE_CXX_COMPILER_ID "Clang")
  set(CMAKE_CXX_COMPILER_VERSION "6.0.1")
  set(CMAKE_CXX_COMPILER_VERSION_INTERNAL "")
  set(CMAKE_CXX_COMPILER_WRAPPER "")
  set(CMAKE_CXX_STANDARD_COMPUTED_DEFAULT "98")
  set(CMAKE_CXX_COMPILE_FEATURES "cxx_std_98;cxx_template_template_parameters;cxx_std_11;cxx_alias_templates;cxx_alignas;cxx_alignof;cxx_attributes;cxx_auto_type;cxx_constexpr;cxx_decltype;cxx_decltype_incomplete_return_types;cxx_default_function_template_args;cxx_defaulted_functions;cxx_defaulted_move_initializers;cxx_delegating_constructors;cxx_deleted_functions;cxx_enum_forward_declarations;cxx_explicit_conversions;cxx_extended_friend_declarations;cxx_extern_templates;cxx_final;cxx_func_identifier;cxx_generalized_initializers;cxx_inheriting_constructors;cxx_inline_namespaces;cxx_lambdas;cxx_local_type_template_args;cxx_long_long_type;cxx_noexcept;cxx_nonstatic_member_init;cxx_nullptr;cxx_override;cxx_range_for;cxx_raw_string_literals;cxx_reference_qualified_functions;cxx_right_angle_brackets;cxx_rvalue_references;cxx_sizeof_member;cxx_static_assert;cxx_strong_enums;cxx_thread_local;cxx_trailing_return_types;cxx_unicode_literals;cxx_uniform_initialization;cxx_unrestricted_unions;cxx_user_literals;cxx_variadic_macros;cxx_variadic_templates;cxx_std_14;cxx_aggregate_default_initializers;cxx_attribute_deprecated;cxx_binary_literals;cxx_contextual_conversions;cxx_decltype_auto;cxx_digit_separators;cxx_generic_lambdas;cxx_lambda_init_captures;cxx_relaxed_constexpr;cxx_return_type_deduction;cxx_variable_templates;cxx_std_17")
  set(CMAKE_CXX98_COMPILE_FEATURES "cxx_std_98;cxx_template_template_parameters")
  set(CMAKE_CXX11_COMPILE_FEATURES "cxx_std_11;cxx_alias_templates;cxx_alignas;cxx_alignof;cxx_attributes;cxx_auto_type;cxx_constexpr;cxx_decltype;cxx_decltype_incomplete_return_types;cxx_default_function_template_args;cxx_defaulted_functions;cxx_defaulted_move_initializers;cxx_delegating_constructors;cxx_deleted_functions;cxx_enum_forward_declarations;cxx_explicit_conversions;cxx_extended_friend_declarations;cxx_extern_templates;cxx_final;cxx_func_identifier;cxx_generalized_initializers;cxx_inheriting_constructors;cxx_inline_namespaces;cxx_lambdas;cxx_local_type_template_args;cxx_long_long_type;cxx_noexcept;cxx_nonstatic_member_init;cxx_nullptr;cxx_override;cxx_range_for;cxx_raw_string_literals;cxx_reference_qualified_functions;cxx_right_angle_brackets;cxx_rvalue_references;cxx_sizeof_member;cxx_static_assert;cxx_strong_enums;cxx_thread_local;cxx_trailing_return_types;cxx_unicode_literals;cxx_uniform_initialization;cxx_unrestricted_unions;cxx_user_literals;cxx_variadic_macros;cxx_variadic_templates")
  set(CMAKE_CXX14_COMPILE_FEATURES "cxx_std_14;cxx_aggregate_default_initializers;cxx_attribute_deprecated;cxx_binary_literals;cxx_contextual_conversions;cxx_decltype_auto;cxx_digit_separators;cxx_generic_lambdas;cxx_lambda_init_captures;cxx_relaxed_constexpr;cxx_return_type_deduction;cxx_variable_templates")
  set(CMAKE_CXX17_COMPILE_FEATURES "")
  set(CMAKE_CXX20_COMPILE_FEATURES "")
  
  set(CMAKE_CXX_PLATFORM_ID "emscripten")
  set(CMAKE_CXX_SIMULATE_ID "")
  set(CMAKE_CXX_SIMULATE_VERSION "")
  
  
  
  set(CMAKE_AR "C:/workspace/emsdk/emscripten/1.38.14/emar.bat")
  set(CMAKE_CXX_COMPILER_AR "C:/Program Files/LLVM/bin/llvm-ar.exe")
  set(CMAKE_RANLIB "C:/workspace/emsdk/emscripten/1.38.14/emranlib.bat")
  set(CMAKE_CXX_COMPILER_RANLIB "C:/Program Files/LLVM/bin/llvm-ranlib.exe")
  set(CMAKE_LINKER "C:/Program Files/LLVM/bin/wasm-ld.exe")
  set(CMAKE_COMPILER_IS_GNUCXX )
  set(CMAKE_CXX_COMPILER_LOADED 1)
  set(CMAKE_CXX_COMPILER_WORKS TRUE)
  set(CMAKE_CXX_ABI_COMPILED )
  set(CMAKE_COMPILER_IS_MINGW )
  set(CMAKE_COMPILER_IS_CYGWIN )
  if(CMAKE_COMPILER_IS_CYGWIN)
    set(CYGWIN 1)
    set(UNIX 1)
  endif()
  
  set(CMAKE_CXX_COMPILER_ENV_VAR "CXX")
  
  if(CMAKE_COMPILER_IS_MINGW)
    set(MINGW 1)
  endif()
  set(CMAKE_CXX_COMPILER_ID_RUN 1)
  set(CMAKE_CXX_IGNORE_EXTENSIONS inl;h;hpp;HPP;H;o;O;obj;OBJ;def;DEF;rc;RC)
  set(CMAKE_CXX_SOURCE_FILE_EXTENSIONS C;M;c++;cc;cpp;cxx;mm;CPP)
  set(CMAKE_CXX_LINKER_PREFERENCE 30)
  set(CMAKE_CXX_LINKER_PREFERENCE_PROPAGATES 1)
  
  # Save compiler ABI information.
  set(CMAKE_CXX_SIZEOF_DATA_PTR "4")
  set(CMAKE_CXX_COMPILER_ABI "")
  set(CMAKE_CXX_LIBRARY_ARCHITECTURE "")
  
  if(CMAKE_CXX_SIZEOF_DATA_PTR)
    set(CMAKE_SIZEOF_VOID_P "${CMAKE_CXX_SIZEOF_DATA_PTR}")
  endif()
  
  if(CMAKE_CXX_COMPILER_ABI)
    set(CMAKE_INTERNAL_PLATFORM_ABI "${CMAKE_CXX_COMPILER_ABI}")
  endif()
  
  if(CMAKE_CXX_LIBRARY_ARCHITECTURE)
    set(CMAKE_LIBRARY_ARCHITECTURE "")
  endif()
  
  set(CMAKE_CXX_CL_SHOWINCLUDES_PREFIX "")
  if(CMAKE_CXX_CL_SHOWINCLUDES_PREFIX)
    set(CMAKE_CL_SHOWINCLUDES_PREFIX "${CMAKE_CXX_CL_SHOWINCLUDES_PREFIX}")
  endif()
  
  
  
  
  
  set(CMAKE_CXX_IMPLICIT_LINK_LIBRARIES "")
  set(CMAKE_CXX_IMPLICIT_LINK_DIRECTORIES "")
  set(CMAKE_CXX_IMPLICIT_LINK_FRAMEWORK_DIRECTORIES "")
  </code></pre>