I installed VS2019, CONNECT and its SDK and I can compile the examples without a problem..
I am trying convert an MDL from SS3 to CONNECT. It is already in .DLL form and compiles within VS in SS3.
When the compiler gets to the type resource, I get this error:
[== Building D:\Users\KWA0GSU\AppData\Local\Temp\Bentley\MicroStationSDK\objects\fplcmd.rsc, (D:\fpl\devStudio\fplmdl\src\fplcmd.r) ==]rcomp @D:\Users\KWA0GSU\AppData\Local\Temp\Bentley\MicroStationSDK\objects\make.optMicroStation Resource Compiler 10.16.01BMAKE: no rules to build D:\Users\KWA0GSU\AppData\Local\Temp\Bentley\MicroStationSDK\objects\fpltyp.rBMAKE: call trace line: 69, D:\fpl\devStudio\fplmdl\src\fplmdl.mkeMon Apr 04 15:30:20 2022, elapsed time: 0:00
My make file looks virtually identical to the myapp.mke example that compiles without error. Does anybody have any idea what could be going wrong here?
#------------------------------------------------------------------------# Generate command table include & resource file using rcomp#------------------------------------------------------------------------$(o)fplcmd.h : $(baseDir)fplcmd.r
$(o)fplcmd.rsc : $(baseDir)fplcmd.r
#------------------------------------------------------------------------# Create & compile the app's type resource using rsctype & rcomp#------------------------------------------------------------------------$(o)fpltyp.r : $(baseDir)$fpltyp.mt \ $(privateInc)fplids.h
$(o)fpltyp.rsc : $(o)fpltyp.r
#------------------------------------------------# Set up to use dlmcomp.mki and dlmlink.mki#------------------------------------------------
Ken Adams said:$(o)fpltyp.r : $(baseDir)$fpltyp.mt \ $(privateInc)fplids.h $(o)fpltyp.rsc : $(o)fpltyp.r
$(o)fpltyp.r : $(baseDir)$fpltyp.mt \ $(privateInc)fplids.h $(o)fpltyp.rsc : $(o)fpltyp.r
make files are sensitive to white space and line feeds. Try this...
$(o)fpltyp.r : $(baseDir)$fpltyp.mt $(privateInc)fplids.h $(o)fpltyp.rsc : $(o)fpltyp.r
Regards, Jon Summers LA Solutions
I had to copy over myapp.mke to get passed this error. Now here is the next one...
[== Building D:\Users\KWA0GSU\AppData\Local\Temp\Bentley\MicroStationSDK\objects\fplmdltyp.r, (D:\fpl\devStudio\fplmdl\src\fplmdl.h) ==]rsctype @D:\Users\KWA0GSU\AppData\Local\Temp\Bentley\MicroStationSDK\objects\make.optMicroStation Type Resource File Generator 10.16.01C:\MDLC\include\Mstn\MdlApi\mselems.h(11) : error: can't open #include file math.hC:\MDLC\include\Mstn\MdlApi\mselems.h(11) : error: No such file or directoryC:\MDLC\include\Bentley/Bentley.h(46) : error: "This file is for C++ compilands only"C:\MDLC\include\Bentley/suppress_warnings.h(11) : warning: pragma not recognized.C:\MDLC\include\Bentley/suppress_warnings.h(12) : warning: pragma not recognized.
Thanks for your help.
Ken
Hi Ken Adams,
For future (new) errors, please create new posts to help ensure when users search they can quickly find and resolve each unique issue.
A couple necessary data points for migrating existing code:
myapp.mke:11:MDLMKI = $(MSMDE)mki/ myapp.mke:12:PolicyFile = $(MDLMKI)MicroStationPolicy.mki
HTH,Bob
Ken Adams said:C:\MDLC\include\Mstn\MdlApi\mselems.h(11) : error: can't open #include file math.h
C:\MDLC\include\Mstn\MdlApi\mselems.h(11) : error: can't open #include file math.h
Are you building your app from the SDK command shell? All paths to header files should be resolved when using that command shell.
I am building from the SDK command shell as aministrator. All the included examples I have tried to compile succeeded without error. it does not seem to like mselems.h specified in my header file during the type resource file generator.
#include <Mstn\MdlApi\mselems.h>
Comparing to myapp, I see only .r.h files in the header file. Is that a requirement? I don't see any mselems.r.h file available.
I tried renaming my header file with a .r.h extension but that made no difference.
From the developer shell, navigate to the folder where your make file is. Type: build verbose. Then review (long sequential file - from bottom up works best) and/or Zip and Attach it so we can get a better idea of what type of problem is being encountered.
If you need more insight into how file extensions rules and dependencies are processed within the make file system (.mki files) this search can help provide those entry points:
findstr -snipr "\.[a-z]*\.[a-z].*:$" "%SDKMKI%*.mki"
Thank you,Bob
Build-fplmdl-Verbose-Output.txt
Ken Adams said:Comparing to myapp, I see only .r.h files in the header file. Is that a requirement?
Bentley Systems have a convention of specifying .r.h as the extension for header files that are safe to include in a resource file. To put that another way, it may not be safe to include a .h file in a resource file.
.r.h
.h
If you look at mselems.h you can see that there's not a lot in it except a few #includes.
mselems.h
Why do you need that header in your type resource? What is in fplids.h?
fplids.h
The build log starting at line 1840 indicates it is encountering an include of math.h (C/C++ header) in the resource file generation portion of the build process. I suggest:
Target: D:\Users\KWA0GSU\AppData\Local\Temp\Bentley\MicroStationSDK\objects\fplmdltyp.r [== Building D:\Users\KWA0GSU\AppData\Local\Temp\Bentley\MicroStationSDK\objects\fplmdltyp.r, (D:\fpl\devStudio\fplmdl\src\fplmdl.h) ==] rsctype @D:\Users\KWA0GSU\AppData\Local\Temp\Bentley\MicroStationSDK\objects\make.opt MicroStation Type Resource File Generator 10.16.01 C:\MDLC\include\Mstn\MdlApi\mselems.h(11) : error: can't open #include file math.h C:\MDLC\include\Mstn\MdlApi\mselems.h(11) : error: No such file or directory C:\MDLC\include\Bentley/Bentley.h(46) : error: "This file is for C++ compilands only"
Bob
Please post the contents of your file fplids.h.
Answer Verified By: Ken Adams
I think the only reason I need mselems.h is I refer to these 2 variables:
MAX_CELLNAME_LENGTH
LinkageHeader
Ken Adams said:I think the only reason I need mselems.h is I refer to these 2 variables
First, they are not variables. MAX_CELLNAME_LENGTH is a macro treated as a constant. LinkageHeader is a struct that you use in your linkdata struct.
linkdata
mselems.h doesn't define those objects. It includes other headers. It's best to include the exact headers you want.
#include <DgnPlatform/DgnPlatform.r.h> // MAX_CELLNAME_LENGTH #include <DgnPlatform/DgnFileIO/DgnElements.h> // LinkageHeader
Ken Adams said:I renamed fplids.h to fplmdl.r.h
Why? Renaming a file achieves nothing. It's the contents of the file that are important. File extension .r.h indicates that the author (that's you) deems the contents to be safe for use by the SDK resource compilers. If you haven't changed the contents of the file, then that's a false indication.
I see that DgnElements.h includes Bentley.h which includes limits.h which is now the incllude file the compiler cannot find.
[== Building D:\Users\KWA0GSU\AppData\Local\Temp\Bentley\MicroStationSDK\objects\fplmdlcmd.rsc, (D:\MDL\devStudio\fplmdl\src\fplmdlcmd.r) ==]rcomp @D:\Users\KWA0GSU\AppData\Local\Temp\Bentley\MicroStationSDK\objects\make.optMicroStation Resource Compiler 10.16.01
[== Building D:\Users\KWA0GSU\AppData\Local\Temp\Bentley\MicroStationSDK\objects\fplmdltyp.r, (D:\MDL\devStudio\fplmdl\src\fplmdl.r.h) ==]rsctype @D:\Users\KWA0GSU\AppData\Local\Temp\Bentley\MicroStationSDK\objects\make.optMicroStation Type Resource File Generator 10.16.01C:\MDLC\include\Bentley/Bentley.h(46) : error: "This file is for C++ compilands only"C:\MDLC\include\Bentley/suppress_warnings.h(11) : warning: pragma not recognized.C:\MDLC\include\Bentley/suppress_warnings.h(12) : warning: pragma not recognized.C:\MDLC\include\Bentley/suppress_warnings.h(13) : warning: pragma not recognized.C:\MDLC\include\Bentley/suppress_warnings.h(14) : warning: pragma not recognized.C:\MDLC\include\Bentley/suppress_warnings.h(16) : warning: pragma not recognized.C:\MDLC\include\Bentley/suppress_warnings.h(17) : warning: pragma not recognized.C:\MDLC\include\Bentley/suppress_warnings.h(18) : warning: pragma not recognized.C:\MDLC\include\Bentley/suppress_warnings.h(19) : warning: pragma not recognized.C:\MDLC\include\Bentley/suppress_warnings.h(28) : warning: pragma not recognized.C:\MDLC\include\Bentley/suppress_warnings.h(33) : warning: pragma not recognized.C:\MDLC\include\Bentley/suppress_warnings.h(39) : warning: pragma not recognized.C:\MDLC\include\Bentley/suppress_warnings.h(40) : warning: pragma not recognized.C:\MDLC\include\Bentley/suppress_warnings.h(41) : warning: pragma not recognized.C:\MDLC\include\Bentley/suppress_warnings.h(43) : warning: pragma not recognized.C:\MDLC\include\Bentley/suppress_warnings.h(44) : warning: pragma not recognized.C:\MDLC\include\Bentley/Bentley.h(70) : warning: macro ENUM_UNDERLYING_TYPE previously defined as .C:\MDLC\include\Bentley/Bentley.h(112) : error: can't open #include file limits.hC:\MDLC\include\Bentley/Bentley.h(112) : error: No such file or directoryC:\MDLC\include\Bentley/Bentley.h(239) : error: Data declarations must be typedefs.C:\MDLC\include\Bentley/Bentley.h(239) : error: expected ;, got BENTLEY_NAMESPACE_NAMEC:\MDLC\include\Bentley/Bentley.h(239) : error: bad declarationC:\MDLC\include\Bentley/Bentley.h(239) : error: Data declarations must be typedefs.C:\MDLC\include\Bentley/Bentley.h(239) : error: expected ;, got }
as a test, I added the 2 headers you suggested to the myapp example's header file myapp.h and I got the same error:
C:\MDLC\include\Bentley/Bentley.h(112) : error: can't open #include file limits.h
Actually, I cannot find limits.h anywhere in the include folder.
The problem is that you are attempting to build a type resource (.mt) file that uses a C struct LinkageHeader defined in a C++ header. The Bentley type resource compiler can't cope with all the C++ baggage that comes with #include <DgnPlatform/DgnFileIO/DgnElements.h>.
.mt
#include <DgnPlatform/DgnFileIO/DgnElements.h>
The purpose of a type (.mt) file is to be processed by publishStructures that is the only statement in your (.mt) file. The reason to publish a structure is so that it can be handled by the MicroStation dialog manager when its data is displayed in a dialog box. Why do you want to display LinkageHeader in a dialog box?
publishStructures
I suggest that you place structs designated for use in the UI in their own header file, and structs that are not used in the UI in a separate header file to be included by your C++ implementation code.
In the myapp example, struct DlogBoxInfo uses primitive data types that are understood by both the C++ compiler and by the Bentley type resource compiler.
DlogBoxInfo
Thank you Jon. Your suggestion resolved this problem. Keep the publishStructures resource separate.
Interestingly, I saw this comment in several examples:
WARNING: Do not mix publishStructures commands with createDataDef
I could not find a single example that uses both a UI and user linkages. Since my application does, I added another resource file for the createDataDef and it seemed to compile fine. Does this look like the correct thing to do?
#------------------------------------------------------------------------# Create & compile the app's type resource using rsctype & rcomp#------------------------------------------------------------------------$(o)$(appName)typ.r : $(baseDir)$(appName)typ.mt $(privateInc)$(appName).r.h
$(o)$(appName)typ.rsc : $(o)$(appName)typ.r
$(o)$(appName)link.r : $(baseDir)$(appName)link.mt $(privateInc)$(appName)link.h
$(o)$(appName)link.rsc : $(o)$(appName)link.r
I am at least past the resource compilation errors and onto the .cpp errors. That feels like an accomplishment! Thanks again for your help.