فهرست منبع

VS: Add /machine: flag to Librarian tool (#11240)

If a Windows resource (.rc) source file is included in a STATIC library,
the VS "link" tool will process the compiled ".res" file and needs to know
the target architecture.  Without it, we may get a LNK4068 warning and
possibly a LNK1112 error.  Add /machine: to the default static library
flags to give the link tool the information it needs.
Brad King 10 سال پیش
والد
کامیت
806609c702
5فایلهای تغییر یافته به همراه12 افزوده شده و 1 حذف شده
  1. 1 0
      Modules/Platform/Windows-MSVC.cmake
  2. 3 0
      Tests/VSResource/CMakeLists.txt
  3. 1 0
      Tests/VSResource/lib.cpp
  4. 4 0
      Tests/VSResource/lib.rc
  5. 3 1
      Tests/VSResource/main.cpp

+ 1 - 0
Modules/Platform/Windows-MSVC.cmake

@@ -230,6 +230,7 @@ elseif(MSVC_Fortran_ARCHITECTURE_ID)
   set(_MACHINE_ARCH_FLAG "/machine:${MSVC_Fortran_ARCHITECTURE_ID}")
 endif()
 set(CMAKE_EXE_LINKER_FLAGS_INIT "${CMAKE_EXE_LINKER_FLAGS_INIT} ${_MACHINE_ARCH_FLAG}")
+set(CMAKE_STATIC_LINKER_FLAGS_INIT "${CMAKE_STATIC_LINKER_FLAGS_INIT} ${_MACHINE_ARCH_FLAG}")
 unset(_MACHINE_ARCH_FLAG)
 
 # add /debug and /INCREMENTAL:YES to DEBUG and RELWITHDEBINFO also add pdbtype

+ 3 - 0
Tests/VSResource/CMakeLists.txt

@@ -46,7 +46,10 @@ else()
   include_directories(${CMAKE_CURRENT_BINARY_DIR})
 endif()
 
+add_library(ResourceLib STATIC lib.cpp lib.rc)
+
 add_executable(VSResource main.cpp test.rc)
+target_link_libraries(VSResource ResourceLib)
 
 set_property(TARGET VSResource
   PROPERTY VS_GLOBAL_CMakeTestVsGlobalVariable "test val")

+ 1 - 0
Tests/VSResource/lib.cpp

@@ -0,0 +1 @@
+int lib() { return 0; }

+ 4 - 0
Tests/VSResource/lib.rc

@@ -0,0 +1,4 @@
+STRINGTABLE
+BEGIN
+  1234 "5"
+END

+ 3 - 1
Tests/VSResource/main.cpp

@@ -1,6 +1,8 @@
 #include <windows.h>
 #include <stdio.h>
 
+extern int lib();
+
 struct x
 {
   const char *txt;
@@ -76,5 +78,5 @@ int main(int argc, char** argv)
       }
     }
 
-  return ret;
+  return ret + lib();
 }