Fix linking errors on Windows (#13100)
Summary:
1. Removes the flag "/FORCE:UNRESOLVED" that shouldn't be used.
2. Fix the code logic for ONNX_BUILD_MAIN_LIBS on Windows
3. Add a patch for protobuf using CMake
Pull Request resolved: https://github.com/pytorch/pytorch/pull/13100
Differential Revision: D12978950
Pulled By: orionr
fbshipit-source-id: db9eb8136acf5712cfb5a24ed228b7934d873331
diff --git a/caffe2/CMakeLists.txt b/caffe2/CMakeLists.txt
index bb06c05..249c867 100644
--- a/caffe2/CMakeLists.txt
+++ b/caffe2/CMakeLists.txt
@@ -517,9 +517,6 @@
if (APPLE)
set_target_properties(caffe2_pybind11_state PROPERTIES LINK_FLAGS "-undefined dynamic_lookup")
endif()
- if (WIN32)
- set_target_properties(caffe2_pybind11_state PROPERTIES LINK_FLAGS "/FORCE:UNRESOLVED")
- endif()
target_include_directories(caffe2_pybind11_state PRIVATE $<INSTALL_INTERFACE:include>)
target_include_directories(caffe2_pybind11_state PRIVATE ${Caffe2_CPU_INCLUDE})
@@ -545,9 +542,6 @@
if (APPLE)
set_target_properties(caffe2_pybind11_state_gpu PROPERTIES LINK_FLAGS "-undefined dynamic_lookup")
endif()
- if (WIN32)
- set_target_properties(caffe2_pybind11_state_gpu PROPERTIES LINK_FLAGS "/FORCE:UNRESOLVED")
- endif()
target_include_directories(caffe2_pybind11_state_gpu PRIVATE $<INSTALL_INTERFACE:include>)
target_include_directories(caffe2_pybind11_state_gpu PRIVATE ${Caffe2_CPU_INCLUDE})
target_link_libraries(
@@ -573,9 +567,6 @@
if (APPLE)
set_target_properties(caffe2_pybind11_state_hip PROPERTIES LINK_FLAGS "-undefined dynamic_lookup")
endif()
- if (WIN32)
- set_target_properties(caffe2_pybind11_state_hip PROPERTIES LINK_FLAGS "/FORCE:UNRESOLVED")
- endif()
target_include_directories(caffe2_pybind11_state_hip PRIVATE $<INSTALL_INTERFACE:include>)
target_include_directories(caffe2_pybind11_state_hip PRIVATE ${Caffe2_CPU_INCLUDE})
target_link_libraries(
diff --git a/cmake/Dependencies.cmake b/cmake/Dependencies.cmake
index db6bffb..cc8e00d 100644
--- a/cmake/Dependencies.cmake
+++ b/cmake/Dependencies.cmake
@@ -931,12 +931,12 @@
endif()
set(TEMP_BUILD_SHARED_LIBS ${BUILD_SHARED_LIBS})
# We will build onnx as static libs and embed it directly into the binary.
- set(BUILD_SHARED_LIBS OFF)
if (MSVC AND BUILD_SHARED_LIBS)
# That also means we want to export all symbols from the shared
# library we are building
set(ONNX_BUILD_MAIN_LIB ON)
endif()
+ set(BUILD_SHARED_LIBS OFF)
set(ONNX_USE_MSVC_STATIC_RUNTIME ${CAFFE2_USE_MSVC_STATIC_RUNTIME})
set(ONNX_USE_LITE_PROTO ${CAFFE2_USE_LITE_PROTO})
# If linking local protobuf, make sure ONNX has the same protobuf
diff --git a/cmake/ProtoBufPatch.cmake b/cmake/ProtoBufPatch.cmake
index f6f09b2..c4cc958 100644
--- a/cmake/ProtoBufPatch.cmake
+++ b/cmake/ProtoBufPatch.cmake
@@ -40,4 +40,22 @@
endif()
endforeach()
+# The moving constructor is defined in the header file, which will cause
+# a link error that claims that the vftable is not found. Luckily, we
+# could move the definition into the source file to solve the problem.
+list(LENGTH NAMESPACES ns_count)
+if ("${FILENAME}" MATCHES ".pb.h" AND ns_count EQUAL 1)
+ string(REPLACE ".pb.h" ".pb.cc" SOURCE_FILENAME ${FILENAME})
+ file(READ ${SOURCE_FILENAME} content_cc_origin)
+
+ string(REGEX MATCHALL "([a-zA-Z_]+)\\([a-zA-Z_]+&& from\\) noexcept[^}]*}" content_cc "${content}")
+ string(REGEX REPLACE "};" "}\n" content_cc "${content_cc}")
+ string(REGEX REPLACE "([a-zA-Z_]+)\\([a-zA-Z_]+&& from\\) noexcept" " \\1::\\1(\\1&& from) noexcept" content_cc "${content_cc}")
+ set(content_cc "${content_cc_origin}\nnamespace ${NAMESPACES} {\n#if LANG_CXX11\n${content_cc}\n#endif\n}")
+
+ string(REGEX REPLACE "([a-zA-Z_]+)\\([a-zA-Z_]+&& from\\) noexcept([^}]*)}" "\\1(\\1&& from) noexcept;" content "${content}")
+
+ file(WRITE ${SOURCE_FILENAME} "${content_cc}")
+endif()
+
file(WRITE ${FILENAME} "${content}")
diff --git a/torch/CMakeLists.txt b/torch/CMakeLists.txt
index ebebaa3..83e5787 100644
--- a/torch/CMakeLists.txt
+++ b/torch/CMakeLists.txt
@@ -347,7 +347,6 @@
set(TORCH_CUDA_LIBRARIES
${NVTOOLEXT_HOME}/lib/x64/nvToolsExt64_1.lib
${CUDA_LIBRARIES})
- set_target_properties(torch PROPERTIES LINK_FLAGS "/FORCE:UNRESOLVED")
target_include_directories(torch PRIVATE "${NVTOOLEXT_HOME}/include")
elseif(APPLE)
set(TORCH_CUDA_LIBRARIES