LINUX.ORG.RU

Сборка проекта СМake в MSVC

 , ,


0

3

Здравствуйте. Возникла такая проблема при сборке проекта из исходных текстов под MSVC 2010. Есть корректно написаный CMakeLists.txt который успешно собирает под Unix и под MinGW (в Windows 7). Но при запуске команды cmake -G «Visual Studio 10» результат таков, что дерево проекта создается, все вспомогательные цели создаются, т.е. .sln файл создается, но при запуске сборки штатным средствами MSVC имеем ошибку содержания: 199 | error LNK1181: cannot open input file 'Release\model.lib'. Model.lib это должна быть согласно сценарию в CMakeLists разделяемая библиотека dll, но почему-то сьатическая не генерируется, хотя она должна автоматически генерироваться и связываться с тестирующим исполняемым модулем чтобы запустить проект в работу. Подскажите, в чем может быть причина отказа выработки model.lib вместе с model.dll. Спасибо.

Cмотри логи.

anonymous ()

хотя она должна автоматически генерироваться и связываться с тестирующим исполняемым модулем чтобы запустить проект в работу.

в начале CMakeLists.txt

set(CMAKE_WINDOWS_EXPORT_ALL_SYMBOLS ON)
Mixail ()

Лог скину по позже. Но там ничего интересного по крайней мере я не нашел. Второй комментарий с set - попробовал, не помогло.

S_Z_T_E_R_N ()

1) Вот что написано в логе: 5> CMake does not need to re-run because D:\CKM_18102016_R_1740_MCBC_ASTRA_WND_SUCCESS_P_2\CKM_18102016_R_1740\build\CMakeFiles\generate.stamp is up-to-date. 5> aero.cpp 5>d:\ckm_18102016_r_1740_mcbc_astra_wnd_success_p_2\ckm_18102016_r_1740\c_k_m\model\compileroptions.h(4): warning C4005: '_CRT_SECURE_NO_WARNINGS' : macro redefinition 5> command-line arguments : see previous definition of '_CRT_SECURE_NO_WARNINGS' *** 5>d:\ckm_18102016_r_1740_mcbc_astra_wnd_success_p_2\ckm_18102016_r_1740\c_k_m\model\compileroptions.h(4): warning C4005: '_CRT_SECURE_NO_WARNINGS' : macro redefinition 5> command-line arguments : see previous definition of '_CRT_SECURE_NO_WARNINGS' 5> ar.cpp 5> at.cpp *** 5>d:\ckm_18102016_r_1740_mcbc_astra_wnd_success_p_2\ckm_18102016_r_1740\c_k_m\model\compileroptions.h(4): warning C4005: '_CRT_SECURE_NO_WARNINGS' : macro redefinition 5> command-line arguments : see previous definition of '_CRT_SECURE_NO_WARNINGS' *** 5> Generating Code... 5>d:\ckm_18102016_r_1740_mcbc_astra_wnd_success_p_2\ckm_18102016_r_1740\c_k_m\model\ckm_okb.cpp(1000): warning C4715: 'CKM_getDynErrH' : not all control paths return a value 5> Compiling... 5> common.cpp 5>d:\ckm_18102016_r_1740_mcbc_astra_wnd_success_p_2\ckm_18102016_r_1740\c_k_m\model\compileroptions.h(4): warning C4005: '_CRT_SECURE_NO_WARNINGS' : macro redefinition 5> command-line arguments : see previous definition of '_CRT_SECURE_NO_WARNINGS' 5> cps.cpp 5>..\c_k_m\model\cps.cpp(26): warning C4305: '=' : truncation from 'double' to 'float' *** 5>..\c_k_m\model\cpsu.cpp(307): warning C4305: '=' : truncation from 'double' to 'float' 5>..\c_k_m\model\cpsu.cpp(348): warning C4101: 'wParity' : unreferenced local variable of '_CRT_SECURE_NO_WARNINGS' *** 5> Generating Code... 5> model.vcxproj -> D:\CKM_18102016_R_1740_MCBC_ASTRA_WND_SUCCESS_P_2\CKM_18102016_R_1740\build\Release\model.dll 6>------ Rebuild All started: Project: test, Configuration: Release Win32 ------ 6> Building Custom Rule D:/CKM_18102016_R_1740_MCBC_ASTRA_WND_SUCCESS_P_2/CKM_18102016_R_1740/c_k_m/CMakeLists.txt 6> CMake does not need to re-run because D:\CKM_18102016_R_1740_MCBC_ASTRA_WND_SUCCESS_P_2\CKM_18102016_R_1740\build\CMakeFiles\generate.stamp is up-to-date. 6> test_mmpd.cpp 6>LINK : fatal error LNK1181: cannot open input file 'Release\model.lib' ========== Rebuild All: 5 succeeded, 1 failed, 0 skipped ========== Где: *** - однотипные предупреждения, 2)Использую версию CMake 2.8.12. А почему нужна именно версия более 3.х. ? С чем это может быть связано, на что может повлиять?

S_Z_T_E_R_N ()
Ответ на: комментарий от S_Z_T_E_R_N

2)Использую версию CMake 2.8.12. А почему нужна именно версия более 3.х. ? С чем это может быть связано, на что может повлиять?

С тем, что CMAKE_WINDOWS_EXPORT_ALL_SYMBOLS добавили в 3.4.

По умолчанию, в MSVC символы «спрятаны» и не экспортируются. Нет экспортов - не создается .lib-файл. Чтобы это исправить, тебе нужно:

А) обновить CMake и использовать CMAKE_WINDOWS_EXPORT_ALL_SYMBOLS, чтобы экспортировать все символы.

Б) создать library.def с описанием всех экспортов https://docs.microsoft.com/en-us/cpp/build/exporting-from-a-dll-using-def-files и добавить его в add_library()

В) обозначить в коде всё экспортируемое из библиотеки как __declspec(dllexport)

Mixail ()
Ответ на: комментарий от Mixail

Спасибо, понял. А функции и объектв, экспортируемые из библиотеки - это те функции которые явно используются в ехе (и объявлены в нем), или это еще и те которые помечены как extern?

S_Z_T_E_R_N ()

Все равно пишет: Unable to start ptogram. Не удается найти ALL_BUILD.

При этом я:

перешел на cmake 3.4.3,

установил переменную CMAKE_WINDOWS_EXPORT_ALL_SYMBOLS,

добавил в h-файл где объявлены экспортируемые функции модификатор __declspec(dllexport) перед прототипом каждой функции,

написал def-файл, в разделе EXPORTS которого в каждой строке со знака табуляции прописал имена экспортируемых функций (при этом пробовал два варианта - указывать после имени добавку @порядковый_номер_функции и без этой добавки - результата это не поменяло),

добавил, как мне посоветовали, имя этого файла в процедуру создания динамической библиотеки add_library() в качестве дополнительного фактического параметра.

В чем может быть ошибка? Спасибо.

S_Z_T_E_R_N ()
Ответ на: комментарий от S_Z_T_E_R_N

Все равно пишет: Unable to start ptogram. Не удается найти ALL_BUILD.

Переключите в MSVS проект по умолчанию на тот, который вы хотите запустить (правой по нему в списке проектов - «выбрать проектом по умолчанию»)

установил ... добавил ... написал

достаточно было использовать только один метод :)

Mixail ()

В общем целом, уже с переходом на третью версию cmake и установке переменной, при построении проекта в visual studio создаются как model.dll так и model.lib - в этом проблема решена, далее, кроме того автоматически генерируется файл экспортов model.exp (ну это и понятно, без него dll не создалась бы, и насколько я понимаю основа для его генерирования это автоматически создаваемый exportall.def?).

Поскольку, как вы говорите выше, можно обойтись одним путем, то я решил .def-файл не создавать. Просто пометил прототипы 2х нужных экспортируемых методов через __declspec (эти функции вызывают функции внутренних классов библиотеки model), а также конструктор и деструктор - все они члены внешнего класса mmpd. Эти две функции (которые из mmpd) и работают в модуле тестирования test.exe (вызываются в его main()).

В общем целом кратко по проекту: cmake генерирует решение а в нем 5 проектов (т.к. в одном общем cmakelists создаются поочередно 5 целей) - статические библиотеки a, b, l_e одного уровня, которые вместе используются model (файлы из model используют информацию статических библиотек) - это 4я цель и затем test.exe - 5я цель, плюс автоматическая цель (6я) ALL_BUILD.

Теперь следующее - проектом по умолчанию (startup project) пометил test. Собираю, запускаю - выдается сообщение системы об ошибке запуска приложения с указанием адреса (0xc0150002).

Интересно, в чем теперь может быть проблема?) Может в том что должен быть один проект в одном решении и проекты в данном случае друг друга не видят?

S_Z_T_E_R_N ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.