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.
This commit is contained in:
Brad King 2015-06-26 09:38:35 -04:00
parent dcc2a7ccd4
commit 806609c702
5 changed files with 12 additions and 1 deletions

View File

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

View File

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

1
Tests/VSResource/lib.cpp Normal file
View File

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

4
Tests/VSResource/lib.rc Normal file
View File

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

View File

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