0

I'm currently developing a binding of a C++ library to NodeJS. While my binding builds and works properly in Linux, I'm having problem with building it in Windows, specifically in linking process. This is the error log. (I only copied a part)

...
tag.obj : error LNK2019: unresolved external symbol "__declspec(dllimport) public: virtual __cdecl TagLib::String::~String(void)" (__imp_??1String@TagLib@@UEAA@XZ) referenced in function "private: class Napi::Value __cdecl Tag::GetAlbum(class Napi::CallbackInfo const &)" (?GetAlbum@Tag@@AEAA?AVValue@Napi@@AEBVCallbackInfo@3@@Z) [C:\Users\anesin1109\Downloads\taglib-node-binding-master\build\taglib-node-binding-native.vcxproj]
tag.obj : error LNK2019: unresolved external symbol "__declspec(dllimport) public: class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > __cdecl TagLib::String::to8Bit(bool)const " (__imp_?to8Bit@String@TagLib@@QEBA?AV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@_N@Z) referenced in function "private: class Napi::Value __cdecl Tag::GetAlbum(class Napi::CallbackInfo const &)" (?GetAlbum@Tag@@AEAA?AVValue@Napi@@AEBVCallbackInfo@3@@Z) [C:\Users\anesin1109\Downloads\taglib-node-binding-master\build\taglib-node-binding-native.vcxproj]
C:\Users\anesin1109\Downloads\taglib-node-binding-master\build\Release\taglib-node-binding-native.node : fatal error LNK1120: 24 unresolved externals [C:\Users\anesin1109\Downloads\taglib-node-binding-master\build\taglib-node-binding-native.vcxproj]

I tried to fix this in various ways-changing the C++ library build options, using different MSVS versions, using cmake-js instead of node-gyp (by the way, I am liking it so I will not move back), and more. Because I can't even figure out what's the problem, I can't guess which information would be helpful to fix this issue. So I just putted the repository link and I will update the question if someone requests any kind of information. Here's the environment information of the last build:

Node v10.16.3, cmake-js v5.3.2, cmake 3.15.3, Visual Studio 2019 x64

+And this is the CMakeLists.txt:

project(taglib-node-binding-native)

set(TAGLIB_VERSION "v1.11.1")
include(ExternalProject)

set(CMAKE_VERBOSE_MAKEFILE OFF)
set(SUPPORT_LARGE_FILES ON)
if(UNIX AND NOT APPLE)
  set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fPIC -std=c++11")
elseif(MSVC)
  set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /W0 /D_WIN32_WINNT=0x0601")
else()
  set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11 -stdlib=libc++ -mmacosx-version-min=10.10")
endif()

ExternalProject_Add(
  taglib
  PREFIX "${CMAKE_SOURCE_DIR}/taglib"
  GIT_REPOSITORY https://github.com/taglib/taglib
  GIT_TAG ${TAGLIB_VERSION}
  INSTALL_DIR "${CMAKE_SOURCE_DIR}/taglib"
  CMAKE_ARGS "-DCMAKE_INSTALL_PREFIX=${CMAKE_SOURCE_DIR}/taglib"
  CMAKE_CACHE_ARGS "-DCMAKE_POSITION_INDEPENDENT_CODE:BOOL=true"
)

ExternalProject_Add_Step(
  taglib
  forcebuild
  COMMAND ${CMAKE_COMMAND} -E echo_append ""
  DEPENDEES configure
  DEPENDEES build
  ALWAYS 1
)

link_directories(${CMAKE_SOURCE_DIR}/taglib/lib)
include_directories(BEFORE ${CMAKE_JS_INC} ${CMAKE_SOURCE_DIR}/taglib/include ${CMAKE_SOURCE_DIR}/node_modules/node-addon-api)

file(GLOB SOURCE_FILES "src/*.cc" "src/*.h")
add_library(${PROJECT_NAME} SHARED ${SOURCE_FILES})
set_target_properties(${PROJECT_NAME} PROPERTIES PREFIX "" SUFFIX ".node")

add_dependencies(${PROJECT_NAME} taglib)

target_link_libraries(${PROJECT_NAME} ${CMAKE_JS_LIB} tag)

Edit: Someone marked this question as a duplicate, but I don't think the linked question gives me an answer for this.

anesin1109
  • 315
  • 3
  • 13
  • You provide no code (it should be in the question post, not linked), no the first error message - how could we help you with that? – Tsyvarev Sep 24 '19 at 08:48
  • @Tsyvarev Sorry for that, the error at the beginning is just the similar link error messages. While I didn't post any code because I thought it's a build environment related problem, I'll post the CMakeLists at least. – anesin1109 Sep 24 '19 at 09:08
  • According to the error message - `tag.obj : error LNK2019` - something wrong with the `taglib` you build as ExternalProject. "While my binding builds and works properly in Linux, I'm having problem with building it in Windows" - You set `CMAKE_CXX_FLAGS` **differently** for Windows and Linux, so this may cause the problem. Note, that `CMAKE_CXX_FLAGS` setting in the main project does **not affect** on ExternalProject. – Tsyvarev Sep 24 '19 at 10:12
  • @Tsyvarev After tinkering with the external project's CMake settings, I got the link error fixed. However, now the NodeJS require() is not recognizing the output file as a module. I probably should file an issue to cmake-js repository. – anesin1109 Sep 24 '19 at 18:33

0 Answers0