Как оказалось, невозможно объединить несколько файлов .a в одну библиотеку .a с помощью утилиты ar: она отказывается генерировать индекс. Рабочим решением является распаковать все объектные файлы из всех статических библиотек, а затем упаковать их в объединенную библиотеку.
Ниже приведены инструкции CMake, с которыми я закончил:
set(COMBINED_CORE_LIB_NAME "${CMAKE_STATIC_LIBRARY_PREFIX}DiligentCore${CMAKE_STATIC_LIBRARY_SUFFIX}")
foreach(CORE_LIB ${DILIGENT_CORE_INSTALL_LIBS_LIST})
list(APPEND CORE_LIB_TARGET_FILES [110]lt;TARGET_FILE:${CORE_LIB}>)
endforeach(CORE_LIB)
if(MSVC)
add_custom_command(
OUTPUT ${COMBINED_CORE_LIB_NAME}
COMMAND ${LIB_EXE} /OUT:${COMBINED_CORE_LIB_NAME} ${CORE_LIB_TARGET_FILES}
DEPENDS ${DILIGENT_CORE_INSTALL_LIBS_LIST}
COMMENT "Combining core libraries..."
)
add_custom_target(DiligentCore-static ALL DEPENDS ${COMBINED_CORE_LIB_NAME})
else()
if(PLATFORM_WIN32)
# do NOT use stock ar on MinGW
find_program(AR NAMES x86_64-w64-mingw32-gcc-ar)
else()
set(AR ${CMAKE_AR})
endif()
if(AR)
add_custom_command(
OUTPUT ${COMBINED_CORE_LIB_NAME}
# Delete all object files from current directory
COMMAND ${CMAKE_COMMAND} -E remove "*${CMAKE_C_OUTPUT_EXTENSION}"
DEPENDS ${DILIGENT_CORE_INSTALL_LIBS_LIST}
COMMENT "Combining core libraries..."
)
# Unpack all object files from all targets to current directory
foreach(CORE_LIB_TARGET ${CORE_LIB_TARGET_FILES})
add_custom_command(
OUTPUT ${COMBINED_CORE_LIB_NAME}
COMMAND ${AR} -x ${CORE_LIB_TARGET}
APPEND
)
endforeach()
# Pack object files to a combined library and delete them
add_custom_command(
OUTPUT ${COMBINED_CORE_LIB_NAME}
COMMAND ${AR} -crs ${COMBINED_CORE_LIB_NAME} "*${CMAKE_C_OUTPUT_EXTENSION}"
COMMAND ${CMAKE_COMMAND} -E remove "*${CMAKE_C_OUTPUT_EXTENSION}"
APPEND
)
add_custom_target(DiligentCore-static ALL DEPENDS ${COMBINED_CORE_LIB_NAME})
else()
message("ar command is not found")
endif()
endif()
if(TARGET DiligentCore-static)
install(FILES "${CMAKE_CURRENT_BINARY_DIR}/${COMBINED_CORE_LIB_NAME}"
DESTINATION "${DILIGENT_CORE_INSTALL_DIR}/lib/"
)
set_target_properties(DiligentCore-static PROPERTIES
FOLDER Core
)
else()
message("Unable to find librarian tool. Combined DiligentCore static library will not be produced.")
endif()
Да к части 1.
Не уверенный в части 2.
Чтобы иметь VS2008 автоматически открывают файлы в Свернутом состоянии, необходимо будет создать дополнение для выполнения "Редактирования. CollapsetoDefinition", когда каждый документ открывается.
Это не чрезмерно хитро - трудные части, кажется, что необходимо выполнить код несколько миллисекунд после того, как документ на самом деле открыт так, необходимо использовать пул потока, чтобы сделать это.
switch (connectMode)
{
case ext_ConnectMode.ext_cm_UISetup:
case ext_ConnectMode.ext_cm_Startup:
//Do nothing OnStartup will be called once IDE is initialised.
break;
case ext_ConnectMode.ext_cm_AfterStartup:
//The addin was started post startup so we need to call its initialisation manually
InitialiseHandlers();
break;
}
private void InitialiseHandlers()
{
this._openHandler = new OnOpenHandler(_applicationObject);
}
public void OnStartupComplete(ref Array custom)
{
InitialiseHandlers();
}
using System;
using System.Collections.Generic;
using System.Text;
using EnvDTE80;
using EnvDTE;
using System.Threading;
namespace Collapser
{
internal class OnOpenHandler
{
DTE2 _application = null;
EnvDTE.Events events = null;
EnvDTE.DocumentEvents docEvents = null;
internal OnOpenHandler(DTE2 application)
{
_application = application;
events = _application.Events;
docEvents = events.get_DocumentEvents(null);
docEvents.DocumentOpened +=new _dispDocumentEvents_DocumentOpenedEventHandler(OnOpenHandler_DocumentOpened);
}
void OnOpenHandler_DocumentOpened(EnvDTE.Document document)
{
if (_application.Debugger.CurrentMode != dbgDebugMode.dbgBreakMode)
{
ThreadPool.QueueUserWorkItem(new WaitCallback(Collapse));
}
}
private void Collapse(object o)
{
System.Threading.Thread.Sleep(150);
_application.ExecuteCommand("Edit.CollapsetoDefinitions", "");
}
}
}
И теперь все открытые файлы должны быть полностью свернуты.
Было бы намного легче использовать Макросы Visual Studio, чтобы сделать то же самое. Редактирование Макро-файла "EnvironmentEvents" в MyMacros и добавление обработчика для DocumentEvents. DocumentOpened с:
DTE.ExecuteCommand ("Редактирование. CollapsetoDefinitions")
Быстрый способ свернуть все схемы до определений функций - это нажать: Кнопка контекстного меню * (рядом с правой кнопкой окна) *, L, O
Я использую ее постоянно. Если для этого есть настоящая горячая клавиша, скажите мне:)
Я сам пробовал разработать код Visual Basic для макроса, заимствуя из разных мест, и не смог заставить что-либо работать. Так что же я сделал? Я задал вопрос по StackOverflow, конечно! Он получил ответ, я добавил предложенный код в свой макрос EnvironmentEvents
, и теперь, когда я открываю файлы CS, примерно через секунду, все мои определения сворачиваются. :)