Сообщество программистов Autodesk в СНГ

ADN Club => ObjectARX => Тема начата: Marik от 25-05-2016, 21:53:27

Название: После компиляции не могу найти arx-файл
Отправлено: Marik от 25-05-2016, 21:53:27
Установил VS2012 Update4...при компиляции не формируется файл .arx. То есть выходной каталог заполняется файлами в том числе и .log, в котором написано "Построение успешно завершено" (что подтверждает правильность путей), но самого файла .arx нет! Где копать?
Название: Re: После компиляции не могу найти arx-файл
Отправлено: Александр Ривилис от 25-05-2016, 22:06:56
Выложи сюда в архиве (zip) весь проект (удали только временные файлы, файл с расширением sdf и каталоги Debug, Release,x86,Win32,Ipch)
Название: Re: После компиляции не могу найти arx-файл
Отправлено: Николай Горлов от 26-05-2016, 09:31:44
если компиляция прошла успешно, то место расположения arx можно узнать так:
(https://adn-cis.org/forum/proxy.php?request=http%3A%2F%2Fs33.postimg.org%2Fukpmnomsr%2Fwheresmyarx.jpg&hash=3f2b7ddc3001f1d4bb0da50ed88d1518) (http://postimg.org/image/ukpmnomsr/)

если в той строке стоит что-то типа ($Release)/lalala.arx, значит arx находится в папке Release текущей конфигурации
Название: Re: После компиляции не могу найти arx-файл
Отправлено: Александр Ривилис от 26-05-2016, 10:11:28
Николай Горлов
Ну тогда нужно добавить, что arx-файл получится если не компилировать, а построить (Build) проект.
Название: Re: После компиляции не могу найти arx-файл
Отправлено: Николай Горлов от 26-05-2016, 10:55:05
Ну тогда нужно добавить, что arx-файл получится если не компилировать, а построить (Build) проект.
))) подловили. в принципе согласен, но на практике - это одно и то же (да и врядли получится собрать проект без его компиляции или скомпилировать без получения результирующего бинарника - lib, dll, exe, ...). Да и если честно, само слово "Build" воспринимается мной как "сборка".
Ну и цитата из MSDN (https://msdn.microsoft.com/en-us/library/cyz1h6zd.aspx):
When you have fully developed and sufficiently debugged a project or solution, you can compile its components in a Release build.

PS: О, пока не забыл, еще дополнение по теме. сам ARX файл может иметь расширение DLL. В принципе это маловероятно, учитывая мусорные props файлы, которые к проекту цепляет arx wizard, но проверить стоит:
(https://adn-cis.org/forum/proxy.php?request=http%3A%2F%2Fs33.postimg.org%2F599y3os8b%2Farxext.jpg&hash=894bc18db76d2ea436d34e27849ed72f) (http://postimg.org/image/599y3os8b/)
короче говоря, это тоже лучше ручками прописывать для каждой конфигурации (по крайней мере я props файлы выгрызаю из проектов сразу после создания нового проекта)
Название: Re: После компиляции не могу найти arx-файл
Отправлено: Александр Ривилис от 26-05-2016, 15:18:48
да и врядли получится собрать проект без его компиляции или скомпилировать без получения результирующего бинарника - lib, dll, exe, ...
Собрать без компиляции не получится, а вот скомпилировать и получить *.obj можно запросто. И тогда и *.arx (или *.dll/*.dbx) можно искать долго и упорно. Но это вопрос не о знании ObjectARX, а об умении пользоваться Visual Studio и понимании процесса создания *.exe/*.dll/*.arx/*.dbx/*.crx при помощи VC++.
Название: Re: После компиляции не могу найти arx-файл
Отправлено: Marik от 26-05-2016, 15:41:22
Вот собрал в архив. *.obj есть, но что с ним делать? В общем-то все действия мои по книге Полещука Н.Н. В VS2015 результатом был файл .arx, который не воспринимался автокадом. Теперь делаю все тоже самое в VS2012 - файла *arx нет.
Название: Re: После компиляции не могу найти arx-файл
Отправлено: Александр Ривилис от 26-05-2016, 16:08:39
Ну если выполнить Build Solution в твоём проекте, то будет ошибка:
Цитировать
App02.obj : error LNK2001: unresolved external symbol "__declspec(dllimport) public: __cdecl AcGePoint3d::AcGePoint3d(void)" (__imp_??0AcGePoint3d@@QEAA@XZ)
E:\RAN\ARX2015\App02\\x64\Release\App02.arx : fatal error LNK1120: 1 unresolved externals
Так что нужно указать для Linker еще и acge20.lib:

(https://adn-cis.org/forum/proxy.php?request=http%3A%2F%2Fimg-fotki.yandex.ru%2Fget%2F38941%2F7842324.6%2F0_12640c_a54aa08c_orig.png&hash=fd6ed9d37e0ebcb3be519d1e3ccc9a08)

Цитировать
И тогда всё собирается:
------ Build started: Project: App02, Configuration: Release x64 ------
Build started 26.05.2016 16:04:55.
InitializeBuildStatus:
  Touching "x64\Release\App02.unsuccessfulbuild".
ClCompile:
  All outputs are up-to-date.
Link:
  Generating code
  Finished generating code
  App02.vcxproj -> E:\RAN\ARX2015\App02\\x64\Release\App02.arx
FinalizeBuildStatus:
  Deleting file "x64\Release\App02.unsuccessfulbuild".
  Touching "x64\Release\App02.lastbuildstate".

Build succeeded.

Time Elapsed 00:00:00.97
========== Build: 1 succeeded, 0 failed, 0 up-to-date, 0 skipped ==========

Синим отмечен путь к полученному arx-файлу.
Название: Re: После компиляции не могу найти arx-файл
Отправлено: Александр Ривилис от 26-05-2016, 16:10:27
Вот собрал в архив. *.obj есть, но что с ним делать?
*.obj - это результаты компиляции. Они промежуточный результат. Следующий этап (упрощенно) линковка, которая и должна создать arx-файл. Чтобы запустить весь процесс выбирай из меню Build Solution (в русской версии это кажется "Построить решение"). 
Николай Горлов
Скажешь что я был неправ? :D
Название: Re: После компиляции не могу найти arx-файл
Отправлено: Marik от 26-05-2016, 17:48:08
О'кей, файл сгенерирован! НО...автокад (2016 и 2015) его не может прочитать. "Не удается загрузить файл...". Код - это пример из поставки ObjectArx2015. Можете запустить его на своем акаде?
Название: Re: После компиляции не могу найти arx-файл
Отправлено: Николай Горлов от 26-05-2016, 18:12:16
Скажешь что я был неправ?  :D
двоякое чувство... хорошо... если на пальцах и не вдаваясь в подробности, то принцип работы по созданию готового бинарника такой:
1. при помощи cl.exe весь код компилируется в obj-файлы
2. из obj-файлов линкер link.exe собирает уже требуемый бинарник.
Глобально всем этим хозяйством в MSVS управляет MSBuild.exe, который по очереди сам запускает нужные экзешники и выводит отчет об их работе в окна "Output" и "Error List". И всё это нажатием одной единственной кнопки - (Project->Build). Причем ошибки могут быть как на этапе компиляции, так и на этапе сборки. Все они попадают в эти окна. Отследить какая именно ошибка можно через окно Output. В каком разделе отобразилась, тот и выявил ошибку (это я про ClCompile:... и Link:...)
Когда-то давным давно у MSVS было отдельное меню Project->Compile, которое занималось проверкой кода на вшивость. Теперь это всё делается в режиме online во время написания кода (это конечно не компиляция, а простая проверка синтаксиса, но для проверки на вшивость все-равно хватает). Так вот, о чем это я... как запустить из современной студии отдельно компилятор (не создавая дополнительных кнопочек и не пользуясь командной строкой) я, если честно, себе не представляю.

И так, вернемся к MSBuild, который последовательно компилирует и собирает наш проект и ВЫВОДИТ ОШИБКИ в окна "Error List" и "Output", если что-то пошло не так!!!
Естественно, если окно "Error List" не открыто, а в окне "Output" что-то написано, но кто ж его читает, то да, признаю, можно при помощи IDE студии только скомпилировать но не собрать проект в arx файл. Но по факту - это не компиляция без линковки а ошибка создания бинарника, которая лечится, если читать сообщения, которые так усердно пытается выдать нам MSBuild, а не пытаться найти файл, которого по указанному пути и быть не должно из-за ошибок во время компиляции/сборки.

О'кей, файл сгенерирован! НО...автокад (2016 и 2015) его не может прочитать. "Не удается загрузить файл...". Код - это пример из поставки ObjectArx2015. Можете запустить его на своем акаде?
разрядность автокада и arx одинаковая? или автокад 32bit, а arx - 64bit?
Название: Re: После компиляции не могу найти arx-файл
Отправлено: Marik от 26-05-2016, 18:15:39
Николай Горлов,  Угу. Разрядность одинаковая - 64bit
Название: Re: После компиляции не могу найти arx-файл
Отправлено: Александр Ривилис от 26-05-2016, 20:28:06
О'кей, файл сгенерирован! НО...автокад (2016 и 2015) его не может прочитать. "Не удается загрузить файл...". Код - это пример из поставки ObjectArx2015. Можете запустить его на своем акаде?
Ох. Если бы ты воспользовался ObjectARX Wizard, то я бы не потратил кучу времени на поиск почему у тебя не грузится в AutoCAD arx-файл.
Добавь в конец App02.cpp такие строки:
Код - C++ [Выбрать]
  1. #if !defined(_WIN64) && !defined (_AC64)
  2.   #pragma comment(linker, "/export:_acrxGetApiVersion,PRIVATE")
  3.   #pragma comment(linker, "/export:acrxEntryPoint,PRIVATE")
  4. #else
  5.   #pragma comment(linker, "/export:acrxGetApiVersion,PRIVATE")
  6.   #pragma comment(linker, "/export:acrxEntryPoint,PRIVATE")
  7. #endif

И снова перестрой решение.
Название: Re: После компиляции не могу найти arx-файл
Отправлено: DimVer от 29-05-2024, 21:52:37
Добрый день, похожая ошибка, вроде бы подключил все необходимые либы, но все равно релиз не собирается.

Код - C++ [Выбрать]
  1. #include "rxregsvc.h"
  2. #include "acutads.h"
  3. #include "tchar.h"
  4.  
  5. #include "aced.h"
  6.  
  7. static void vdiTestCommand() {
  8.     acutPrintf(_T("Тестовая команда выполнена\n"));
  9. }
  10.  
  11. // Simple acrxEntryPoint code. Normally intialization and cleanup
  12. // (such as registering and removing commands) should be done here.
  13. //
  14. extern "C" AcRx::AppRetCode
  15. acrxEntryPoint(AcRx::AppMsgCode msg, void* appId)
  16. {
  17.     switch (msg) {
  18.     case AcRx::kInitAppMsg:
  19.  
  20.         acedRegCmds->addCommand(_T("VDI_TEST_COMMANDS"),
  21.             _T("VDI_TEST"), _T("VDI_TEST"), ACRX_CMD_TRANSPARENT,
  22.             vdiTestCommand);
  23.  
  24.  
  25.         // Allow application to be unloaded
  26.         // Without this statement, AutoCAD will
  27.         // not allow the application to be unloaded
  28.         // except on AutoCAD exit.
  29.         //
  30.         acrxUnlockApplication(appId);
  31.         // Register application as MDI aware.
  32.         // Without this statement, AutoCAD will
  33.         // switch to SDI mode when loading the
  34.         // application.
  35.         //
  36.         acrxRegisterAppMDIAware(appId);
  37.         acutPrintf(_T("Приложение загружено\n"));
  38.         break;
  39.     case AcRx::kUnloadAppMsg:
  40.         acedRegCmds->removeGroup(_T("VDI_TEST_COMMANDS"));
  41.         acutPrintf(_T("Приложение выгружено\n"));
  42.         break;
  43.     }
  44.     return AcRx::kRetOK;
  45. }
  46.  

Ошибка:

Цитировать
Build started at 21:50...
1>------ Build started: Project: TestApp002, Configuration: Release x64 ------
1>TestApp002.cpp
1>   Creating library C:\Work\Apps\ObjectARX\Apps\TestApp002\x64\Release\TestApp002.lib and object C:\Work\Apps\ObjectARX\Apps\TestApp002\x64\Release\TestApp002.exp
1>TestApp002.obj : error LNK2001: unresolved external symbol "public: static class AcRxClass * __cdecl AcEdCommandStack::desc(void)" (?desc@AcEdCommandStack@@SAPEAVAcRxClass@@XZ)
1>TestApp002.obj : error LNK2001: unresolved external symbol acrxSysRegistry
1>TestApp002.obj : error LNK2001: unresolved external symbol "public: static class AcRxResourceInstance const & __cdecl AcRxResourceInstance::empty(void)" (?empty@AcRxResourceInstance@@SAAEBV1@XZ)
1>TestApp002.obj : error LNK2001: unresolved external symbol "public: static bool __cdecl AcRxClass::isDerivedFrom(class AcRxClass const *,class AcRxClass const *)" (?isDerivedFrom@AcRxClass@@SA_NPEBV1@0@Z)
1>C:\Work\Apps\ObjectARX\Apps\TestApp002\x64\Release\TestApp002.arx : fatal error LNK1120: 4 unresolved externals
1>Done building project "TestApp002.vcxproj" -- FAILED.
========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========
========== Build completed at 21:50 and took 02,247 seconds ==========

В чем может быть проблема?
Название: Re: После компиляции не могу найти arx-файл
Отправлено: Александр Ривилис от 29-05-2024, 21:56:59
вроде бы подключил все необходимые либы
Неа. Не подключил. И это хорошо видно по протоколу.
Название: Re: После компиляции не могу найти arx-файл
Отправлено: DimVer от 29-05-2024, 22:00:44
По документации должно быть так:
AcEd
 acad.lib, rxapi.lib, acdb24.lib
 
Все добавлены..
Название: Re: После компиляции не могу найти arx-файл
Отправлено: Александр Ривилис от 29-05-2024, 22:21:47
По документации должно быть так:
AcEd
 acad.lib, rxapi.lib, acdb24.lib
 
Все добавлены..
Это не все. Еще как минимум accore.lib. И скорее всего ещё кое что. Сейчас нет возможности проверить. Добавь все .lib из каталога lib-x64 - не ошибёшься.
Название: Re: После компиляции не могу найти arx-файл
Отправлено: DimVer от 29-05-2024, 22:26:52
Спасибо, попробую. А есть какой то разумный способ определять что надо линковать, при добавлении функционала? Насколько я понимаю - если все это слинковать, то всё это добавиться в файл приложения?
Название: Re: После компиляции не могу найти arx-файл
Отправлено: Александр Ривилис от 29-05-2024, 22:32:31
Насколько я понимаю - если все это слинковать, то всё это добавиться в файл приложения?
Нет. Добавится только то, что реально используется.