From 13a6ff31becea16d567b23abc68bfa8aa75365ce Mon Sep 17 00:00:00 2001 From: Brad King Date: Wed, 20 Jul 2016 11:26:55 -0400 Subject: VS: Fix WINDOWS_EXPORT_ALL_SYMBOLS for object libraries Teach Visual Studio generators to include object files from object libraries in the list of objects whose symbols are to be exported. The Makefile and Ninja generators already did this. Update the test to cover this case. Reported-by: Bertrand Bellenot --- Source/cmGlobalVisualStudioGenerator.cxx | 7 +++++++ Tests/RunCMake/AutoExportDll/AutoExport.cmake | 4 +++- Tests/RunCMake/AutoExportDll/objlib.c | 4 ++++ Tests/RunCMake/AutoExportDll/say.cxx | 2 ++ 4 files changed, 16 insertions(+), 1 deletion(-) create mode 100644 Tests/RunCMake/AutoExportDll/objlib.c diff --git a/Source/cmGlobalVisualStudioGenerator.cxx b/Source/cmGlobalVisualStudioGenerator.cxx index 1bec581..7bdd74d 100644 --- a/Source/cmGlobalVisualStudioGenerator.cxx +++ b/Source/cmGlobalVisualStudioGenerator.cxx @@ -827,6 +827,7 @@ void cmGlobalVisualStudioGenerator::AddSymbolExportCommand( cmSystemTools::Error("could not open ", objs_file.c_str()); return; } + std::vector objs; for (std::vector::const_iterator it = objectSources.begin(); it != objectSources.end(); ++it) { @@ -836,6 +837,12 @@ void cmGlobalVisualStudioGenerator::AddSymbolExportCommand( // It must exist because we populated the mapping just above. assert(!map_it->second.empty()); std::string objFile = obj_dir + map_it->second; + objs.push_back(objFile); + } + gt->UseObjectLibraries(objs, configName); + for (std::vector::iterator it = objs.begin(); it != objs.end(); + ++it) { + std::string objFile = *it; // replace $(ConfigurationName) in the object names cmSystemTools::ReplaceString(objFile, this->GetCMakeCFGIntDir(), configName.c_str()); diff --git a/Tests/RunCMake/AutoExportDll/AutoExport.cmake b/Tests/RunCMake/AutoExportDll/AutoExport.cmake index bdddb38..d37e896 100644 --- a/Tests/RunCMake/AutoExportDll/AutoExport.cmake +++ b/Tests/RunCMake/AutoExportDll/AutoExport.cmake @@ -2,7 +2,9 @@ project(autoexport) set(CMAKE_WINDOWS_EXPORT_ALL_SYMBOLS TRUE) set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${autoexport_BINARY_DIR}/bin) add_subdirectory(sub) -add_library(autoexport SHARED hello.cxx world.cxx foo.c) +add_library(objlib OBJECT objlib.c) +set_property(TARGET objlib PROPERTY POSITION_INDEPENDENT_CODE 1) +add_library(autoexport SHARED hello.cxx world.cxx foo.c $) add_executable(say say.cxx) if(MSVC) diff --git a/Tests/RunCMake/AutoExportDll/objlib.c b/Tests/RunCMake/AutoExportDll/objlib.c new file mode 100644 index 0000000..54a9658 --- /dev/null +++ b/Tests/RunCMake/AutoExportDll/objlib.c @@ -0,0 +1,4 @@ +int objlib() +{ + return 7; +} diff --git a/Tests/RunCMake/AutoExportDll/say.cxx b/Tests/RunCMake/AutoExportDll/say.cxx index 9ca8d31..e966b1f 100644 --- a/Tests/RunCMake/AutoExportDll/say.cxx +++ b/Tests/RunCMake/AutoExportDll/say.cxx @@ -11,6 +11,7 @@ extern "C" { int WINAPI foo(); // test regular C int bar(); +int objlib(); } // test c++ functions @@ -39,6 +40,7 @@ int main() foo(); printf("\n"); bar(); + objlib(); printf("\n"); return 0; } -- cgit v0.12