crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

 
Ответить в данную темуНачать новую тему
> cmake + msvc + rc, добавление ресурсов к dll
igor_bogomolov
  опции профиля:
сообщение 5.1.2011, 1:45
Сообщение #1


Профессионал
*****

Группа: Сомодератор
Сообщений: 1215
Регистрация: 22.3.2009
Из: Саратов
Пользователь №: 630

Спасибо сказали: 235 раз(а)




Репутация:   29  


Имею 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
  опции профиля:
сообщение 5.1.2011, 2:50
Сообщение #2


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9669
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

Спасибо сказали: 807 раз(а)




Репутация:   94  


Цитата(igor_bogomolov @ 5.1.2011, 3:45) *
express версия вообще позволяет ресурсы к библиотеке добавлять?
ну а ты без CMake-а попробуй, самой студией (экспресс). Будут ресурсы вкомпиливаться или нет?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
igor_bogomolov
  опции профиля:
сообщение 5.1.2011, 11:11
Сообщение #3


Профессионал
*****

Группа: Сомодератор
Сообщений: 1215
Регистрация: 22.3.2009
Из: Саратов
Пользователь №: 630

Спасибо сказали: 235 раз(а)




Репутация:   29  


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

Я нашел примеры файлов ресурсов в инете, пытался их подсунуть. Самое интересное что они компилируются, я это вижу, но к dll никакая информация не добавляется
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
DEADHUNT
  опции профиля:
сообщение 5.1.2011, 13:47
Сообщение #4


Активный участник
***

Группа: Участник
Сообщений: 430
Регистрация: 15.4.2009
Пользователь №: 686

Спасибо сказали: 26 раз(а)




Репутация:   2  


это 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
  опции профиля:
сообщение 5.1.2011, 14:15
Сообщение #5


Профессионал
*****

Группа: Сомодератор
Сообщений: 1215
Регистрация: 22.3.2009
Из: Саратов
Пользователь №: 630

Спасибо сказали: 235 раз(а)




Репутация:   29  


DEADHUNT, так ведь windres это утилита mingw. Именно так я и делаю когда использую этот компилятор. А сейчас меня компилятор msvc интересует. В нем есть утилита RC, для компиляции ресурсов. Он на самом деле запускается, и некий скомпилированный файл ресурсов (с расширением .rc.res) я получаю. Но эта информация не добавляется к dll.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
DEADHUNT
  опции профиля:
сообщение 5.1.2011, 15:14
Сообщение #6


Активный участник
***

Группа: Участник
Сообщений: 430
Регистрация: 15.4.2009
Пользователь №: 686

Спасибо сказали: 26 раз(а)




Репутация:   2  


попробуй в add_library напрямую res файл указать
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
igor_bogomolov
  опции профиля:
сообщение 5.1.2011, 16:10
Сообщение #7


Профессионал
*****

Группа: Сомодератор
Сообщений: 1215
Регистрация: 22.3.2009
Из: Саратов
Пользователь №: 630

Спасибо сказали: 235 раз(а)




Репутация:   29  


Так этот файл результат компиляции, изначально его нет. Поэтому 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
  опции профиля:
сообщение 5.1.2011, 16:12
Сообщение #8


Активный участник
***

Группа: Участник
Сообщений: 430
Регистрация: 15.4.2009
Пользователь №: 686

Спасибо сказали: 26 раз(а)




Репутация:   2  


пропиши правило аналогичное
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
  опции профиля:
сообщение 5.1.2011, 17:06
Сообщение #9


Профессионал
*****

Группа: Сомодератор
Сообщений: 1215
Регистрация: 22.3.2009
Из: Саратов
Пользователь №: 630

Спасибо сказали: 235 раз(а)




Репутация:   29  


Сделал так
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
  опции профиля:
сообщение 5.1.2011, 18:26
Сообщение #10


Профессионал
*****

Группа: Сомодератор
Сообщений: 1215
Регистрация: 22.3.2009
Из: Саратов
Пользователь №: 630

Спасибо сказали: 235 раз(а)




Репутация:   29  


Такая вот новая информация. Если я генерирую файл проекта для студии
cmake -G "Visual Studio 10" ..
открываю проект и компилирую уже с студии, то все отрабатывает правильно. Ресурсы добавляются.

Если я делаю так
cmake -G "NMake Makefiles" ..
и компилирую в консоли (этот вариант мне больше подходит), ресурсы к dll не добавляются. Чего же блин не хватает?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0




RSS Текстовая версия Сейчас: 27.12.2024, 12:53