Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: cmake + msvc + rc
Форум на CrossPlatform.RU > Разработка > Инструменты разработчика
igor_bogomolov
Имею microsoft visual c++ 2010 express. Никак не могу прикрутить ресурсы к dll.
Делаю так:
1. Получил кое как шаблон файла ресурса при помощи IDE, немного модифицировал его
win_resources.rc
// Описание ресурсов, созданное в Microsoft Visual C++.
//
#include "..\resource.h"

#define APSTUDIO_READONLY_SYMBOLS

/////////////////////////////////////////////////////////////////////////////
#undef APSTUDIO_READONLY_SYMBOLS

/////////////////////////////////////////////////////////////////////////////
// ресурсы Русский (Россия)

VS_VERSION_INFO VERSIONINFO
FILEVERSION 1, 0, 0, 100
PRODUCTVERSION 1, 0, 0, 1
FILEFLAGSMASK 0x3fL
#ifdef _DEBUG
FILEFLAGS 0x9L
#else
FILEFLAGS 0x8L
#endif
FILEOS 0x4L
FILETYPE 0x1L
FILESUBTYPE 0x0L
BEGIN
    BLOCK "StringFileInfo"
    BEGIN
        BLOCK "040904b0"
        BEGIN
            VALUE "Comments", "Comments"
            VALUE "CompanyName", "MyCompany"
            VALUE "FileDescription", "FileDescription"
            VALUE "FileVersion", "1, 0, 0, 100"
            VALUE "InternalName", "InternalName"
            VALUE "LegalCopyright", "Copyright (C) 2010"
            VALUE "OriginalFilename", "npapi_plugin.dll"
            VALUE "PrivateBuild", "RCVERSION-20030212_100"
            VALUE "ProductName", "ProductName"
            VALUE "ProductVersion", "1, 0, 0, 1"
        END
    END
    BLOCK "VarFileInfo"
    BEGIN
        VALUE "Translation", 0x409, 1200
    END
END

#ifdef APSTUDIO_INVOKED
/////////////////////////////////////////////////////////////////////////////
//
// TEXTINCLUDE
//

1 TEXTINCLUDE  
BEGIN
    "resource.h\0"
    "\0"
END

2 TEXTINCLUDE  
BEGIN
    "#include ""afxres.h""\r\n"
    "\0"
END

3 TEXTINCLUDE  
BEGIN
    "\0"
END

#endif    // APSTUDIO_INVOKED

/////////////////////////////////////////////////////////////////////////////



#ifndef APSTUDIO_INVOKED
/////////////////////////////////////////////////////////////////////////////
//
// Создано из ресурса TEXTINCLUDE 3.
//


/////////////////////////////////////////////////////////////////////////////
#endif    // не APSTUDIO_INVOKED


2. Добавил правило для сборки в cmake
    list(APPEND RCFILE  ${PROJECT_SOURCE_DIR}/win_resources.rc)
    add_library(${PROJECT} SHARED ${SOURCES}
                                  ${DEFFILE}
                                  ${RCFILE}

3. Компилирую

Dll компилируется, ресурсы тоже, но реально в dll никакой информации не добавляется.
Почему?



express версия вообще позволяет ресурсы к библиотеке добавлять?
Litkevich Yuriy
Цитата(igor_bogomolov @ 5.1.2011, 3:45) *
express версия вообще позволяет ресурсы к библиотеке добавлять?
ну а ты без CMake-а попробуй, самой студией (экспресс). Будут ресурсы вкомпиливаться или нет?
igor_bogomolov
Цитата(Litkevich Yuriy @ 5.1.2011, 2:50) *
ну а ты без CMake-а попробуй, самой студией (экспресс). Будут ресурсы вкомпиливаться или нет?
Пытался, конечно, но не получилось. Сама студия (express) имеет ограничения в работе с ресурсами, я не нашел нужного пункта в меню (делал по докам с msdn) для создания файла ресурсов. Но если создать новый проект, студия его создаст (имею в виду файл ресурсов), но редактирование его не доступно.

Я нашел примеры файлов ресурсов в инете, пытался их подсунуть. Самое интересное что они компилируются, я это вижу, но к dll никакая информация не добавляется
DEADHUNT
это cmake ограничение, он не умеет напрямую ресурсы добавлять(помню по MinGW)
add_custom_command(OUTPUT 
    ${CMAKE_CURRENT_BINARY_DIR}/icon_rc.o
    COMMAND windres.exe
    -i ${CMAKE_CURRENT_SOURCE_DIR}/resources/icon.rc
    -o ${CMAKE_CURRENT_BINARY_DIR}/icon_rc.o)
set(win_resources ${CMAKE_CURRENT_BINARY_DIR}/icon_rc.o)
endif ()

вот такой workaround, вначале объектник из ресурса создаётся, а он потом линкуется. тебе надо res сделать.
igor_bogomolov
DEADHUNT, так ведь windres это утилита mingw. Именно так я и делаю когда использую этот компилятор. А сейчас меня компилятор msvc интересует. В нем есть утилита RC, для компиляции ресурсов. Он на самом деле запускается, и некий скомпилированный файл ресурсов (с расширением .rc.res) я получаю. Но эта информация не добавляется к dll.
DEADHUNT
попробуй в add_library напрямую res файл указать
igor_bogomolov
Так этот файл результат компиляции, изначально его нет. Поэтому cmake выдаёт ошибку, что такого файла не существует.
Цитата
Cannot find source file "win_resources.rc.res". Tried extensions .c .C
.c++ .cc .cpp .cxx .m .M .mm .h .hh .h++ .hm .hpp .hxx .in .txx

Как его правильно добавить?
DEADHUNT
пропиши правило аналогичное
add_custom_command(OUTPUT 
    ${CMAKE_CURRENT_BINARY_DIR}/icon_rc.o
    COMMAND windres.exe
    -i ${CMAKE_CURRENT_SOURCE_DIR}/resources/icon.rc
    -o ${CMAKE_CURRENT_BINARY_DIR}/icon_rc.o)
set(win_resources ${CMAKE_CURRENT_BINARY_DIR}/icon_rc.o)
endif ()

только для rc, а потом добавляй полученный res.
igor_bogomolov
Сделал так
add_custom_command(OUTPUT 
    ${CMAKE_CURRENT_SOURCE_DIR}/win_resources.rc.res
    COMMAND rc.exe ${CMAKE_CURRENT_SOURCE_DIR}/win_resources.rc)
set(RCFILE ${CMAKE_CURRENT_SOURCE_DIR}/win_resources.rc.res)


Результат тот же. Всё компилируется но дополнительной информации в dll нет.
Может у меня файл ресурсов не правильный.
Раскрывающийся текст
VS_VERSION_INFO VERSIONINFO
FILEVERSION 1, 0, 0, 100
PRODUCTVERSION 1, 0, 0, 1
FILEFLAGSMASK 0x3fL
#ifdef _DEBUG
FILEFLAGS 0x9L
#else
FILEFLAGS 0x8L
#endif
FILEOS 0x4L
FILETYPE 0x1L
FILESUBTYPE 0x0L
BEGIN
    BLOCK "StringFileInfo"
    BEGIN
        BLOCK "040904b0"
        BEGIN
            VALUE "Comments", "Modified by BZCToOn's"
            VALUE "CompanyName", "Syntheretix"
            VALUE "FileDescription", "rcversion MFC Application"
            VALUE "FileVersion", "1, 0, 0, 100"
            VALUE "InternalName", "rcversion"
            VALUE "LegalCopyright", "Copyleft (C) Bzc ToOn'S 2002"
            VALUE "OriginalFilename", "npapi_filemanager.dll"
            VALUE "PrivateBuild", "RCVERSION-20030212_100"
            VALUE "ProductName", "rcversion Application"
            VALUE "ProductVersion", "1, 0, 0, 1"
        END
    END
    BLOCK "VarFileInfo"
    BEGIN
        VALUE "Translation", 0x409, 1200
    END
END

Я этот пример тупо в инете нарыл. Что например значит BLOCK "040904b0"? Что это за цифры?
Как должен выглядеть файл ресурсов? Мне на самом деле нужно добавить информацию о MIMEType.
igor_bogomolov
Такая вот новая информация. Если я генерирую файл проекта для студии
cmake -G "Visual Studio 10" ..
открываю проект и компилирую уже с студии, то все отрабатывает правильно. Ресурсы добавляются.

Если я делаю так
cmake -G "NMake Makefiles" ..
и компилирую в консоли (этот вариант мне больше подходит), ресурсы к dll не добавляются. Чего же блин не хватает?
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Форум IP.Board © 2001-2024 IPS, Inc.