Как использовать CMake для создания проекта против ссылки на некоторые DLL-файлы - PullRequest
1 голос
/ 17 ноября 2010

Я использую Cmake для генерации VS проекта, основанного на каком-то файле dll

if(WIN32)
    MESSAGE(WINDOWS)
    LINK_LIBRARIES(${***_Test_SOURCE_DIR}/../../Build/Win32/Release/***.dll)
else(WIN32)
    MESSAGE(POSIX)
    LINK_LIBRARIES(${***_Test_SOURCE_DIR}/../../Build/POSIX/lib***.so)
endif(WIN32)

Но когда я открою сгенерированный проект, собери и выкинь

\***.dll : fatal error LNK1107: invalid or corrupt file: cannot read at 0x2B0

У кого-нибудь есть идеи?

Если не использовать CMake, как добавить внешний файл dll (не относится к какому-либо проекту) в проект VS. Могу ли я следовать строгим шагам?

Спасибо

1 Ответ

3 голосов
/ 17 ноября 2010
  • В Windows вам нужно связать с .lib , а не с .dll , это глупо, но Microsoft использует тот же .lib расширение для статических и динамических библиотек. Где-то в ${***_Test_SOURCE_DIR}/../../Build/Win32/Release/ должно быть ***.lib.

    LINK_LIBRARIES(${***_Test_SOURCE_DIR}/../../Build/Win32/Release/***.lib)
    
  • Если это не так, вы можете следовать этой статье, чтобы создать .lib из .dll: Как создать 32-битные библиотеки импорта без .OBJs или Source . Кратко (взято из в блоге Адриана Хенке ), в командной строке VS:

    dumpbin /exports C:\yourpath\yourlib.dll
    

Это выведет довольно много текста на консоль. Однако нас интересуют только функции:

ordinal hint RVA      name

1    0 00017770 jcopy_block_row
2    1 00017710 jcopy_sample_rows
3    2 000176C0 jdiv_round_up
4    3 000156D0 jinit_1pass_quantizer
5    4 00016D90 jinit_2pass_quantizer
6    5 00005750 jinit_c_coef_controller
...etc

Теперь скопируйте все эти имена функций (только имена!) И вставьте их в новый текстовый файл. Назовите следующий файл yourlib.def и поместите строку «ЭКСПОРТ» в ее верхнюю часть. Мой файл yourlib.def выглядит так:

EXPORTS
jcopy_block_row
jcopy_sample_rows
jdiv_round_up
jinit_1pass_quantizer
jinit_2pass_quantizer
jinit_c_coef_controller
...

Теперь из этого файла определения мы наконец можем создать файл .lib. Для этого мы используем инструмент «lib», поэтому запустите эту команду в командной строке Visual Studio:

lib /def:C:\mypath\mylib.def /OUT:C:\mypath\mylib.lib
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...