home *** CD-ROM | disk | FTP | other *** search
/ Black Box 4 / BlackBox.cdr / progc / c_all592.arj / TI864.ASC < prev    next >
Text File  |  1992-04-02  |  22KB  |  727 lines

  1.  
  2.  
  3.  
  4.  
  5.  
  6.  
  7.  
  8.   PRODUCT  :  Borland C++                            NUMBER  :  864
  9.   VERSION  :  ANY
  10.        OS  :  NA
  11.      DATE  :  April 2, 1992                           PAGE  :  1/11
  12.  
  13.     TITLE  :  Understanding "Undefined Symbol" Error Messages.
  14.  
  15.  
  16.  
  17.  
  18.   One of the most common error messages seen by developers using a
  19.   C or C++ compiler is "undefined symbol."  This document provides
  20.   a general description of what causes undefined symbol error
  21.   messages, as well as instructions on solving specific undefined
  22.   symbol errors.
  23.  
  24.  
  25.   UNDEFINED SYMBOL AT COMPILE TIME
  26.        An undefined symbol at compile time indicates that the named
  27.        identifier was used in the named source file, but had no
  28.        definition in the source file.  This is usually caused by a
  29.        misspelled identifier name, or missing declaration of the
  30.        identifier used.
  31.  
  32.        EXAMPLE 1:
  33.             int main(void)
  34.             {
  35.                  test = 1;
  36.                  return 0;
  37.             }
  38.  
  39.        The code shown for example one will cause an undefined
  40.        symbol error message to be displayed becuase the variable
  41.        "test" has not been declared in either a header file which
  42.        has been included or in the actual code itself.
  43.  
  44.        EXAMPLE 2:
  45.             int main(void)
  46.             {
  47.                  int test;
  48.                  Test = 1;
  49.                  return 0;
  50.             }
  51.  
  52.        The code shown for example one will cause an undefined
  53.        symbol error message to be displayed because when the
  54.        variable "test" was used it was misspelled.  The misspelling
  55.        was a capital 't' instead of a lower case 't'.
  56.  
  57.        EXAMPLE 3:
  58.             int main(void)
  59.             {
  60.                  int test;
  61.  
  62.  
  63.  
  64.  
  65.  
  66.  
  67.  
  68.  
  69.  
  70.  
  71.  
  72.  
  73.  
  74.   PRODUCT  :  Borland C++                            NUMBER  :  864
  75.   VERSION  :  ANY
  76.        OS  :  NA
  77.      DATE  :  April 2, 1992                           PAGE  :  2/11
  78.  
  79.     TITLE  :  Understanding "Undefined Symbol" Error Messages.
  80.  
  81.  
  82.  
  83.  
  84.                  test = 1;
  85.                  return 0;
  86.             }
  87.  
  88.        The code shown in example three has no errors and is an
  89.        example of what must be done to resolve an undefined symbol
  90.        error message.  In the example here we simply made sure we
  91.        have a definition for the integer test and that we spelled
  92.        it the same at the time we used it.  It's that simple!
  93.  
  94.  
  95.   UNDEFINED SYMBOL AT LINK TIME
  96.        When linking multi-file projects, the linker must resolve
  97.        all references to functions and global variables shared
  98.        between modules.  When these references cannot be resolved,
  99.        the linker generates an "undefined symbol" error message.
  100.        This means that after searching all of the object files and
  101.        libraries which are included in the link, the linker was
  102.        unable to find a declartion for the identifier you were
  103.        using.  This can be caused by:
  104.  
  105.             forgetting to include a needed object module or library
  106.             in your link (project file, response file, or command
  107.             line).
  108.  
  109.             misspelling the name of the undefined symbol either
  110.             where it was used or where it was declared.
  111.  
  112.             in the case of global variables, all may have been
  113.             declared "extern".
  114.  
  115.             mixing C++ with C or Assembly modules, you may have
  116.             forgotten to use extern "C" to disable name mangling.
  117.             See the specific entry on this subject elsewhere in
  118.             this document or consult the helpme!.doc file included
  119.             with the product.
  120.  
  121.             one of your modules may have Generate Underbars turned
  122.             OFF.
  123.  
  124.        If all else fails, TDUMP.EXE both object modules and note
  125.        any difference between symbols.  This will usually trigger
  126.        an insight sufficient to resolve the problem.  For specific
  127.  
  128.  
  129.  
  130.  
  131.  
  132.  
  133.  
  134.  
  135.  
  136.  
  137.  
  138.  
  139.  
  140.   PRODUCT  :  Borland C++                            NUMBER  :  864
  141.   VERSION  :  ANY
  142.        OS  :  NA
  143.      DATE  :  April 2, 1992                           PAGE  :  3/11
  144.  
  145.     TITLE  :  Understanding "Undefined Symbol" Error Messages.
  146.  
  147.  
  148.  
  149.  
  150.        information on using TDUMP.EXE, please consult the
  151.        documentation included with the product.
  152.  
  153.  
  154.   COMMON UNDEFINED SYMBOL ERRORS
  155.        The following list provides solutions to some of the more
  156.        common causes of undefined symbol errors:
  157.  
  158.        UNDEFINED SYMBOL WHEN TLINKING FROM DOS COMMAND LINE
  159.             The TLINK command line must have the libraries in the
  160.             following order ( GRAPHICS.LIB + <user libs> + EMU.LIB
  161.             + MATH (S,T,C,M,L - for model) + C (S,T,C,M,L - for
  162.             model)
  163.  
  164.        UNDEFINED SYMBOL LINKING C/C++ AND ASSEMBLY MODULES
  165.             There are several sources of undefined symbol errors
  166.             when trying to link assembly with C or C++ modules:
  167.  
  168.                  The Turbo Assembler generates all uppercase
  169.                  symbols unless you specify /ml or /mx on the
  170.                  assembly command line. Since C modules are, by
  171.                  default, case sensitive, failing to do this will
  172.                  result in undefined symbols for all symbols that
  173.                  are not completely upper case in the C module(s).
  174.  
  175.                  The symbols in the assembly file being referenced
  176.                  from a C module must be declared using a PUBLIC
  177.                  directive. TLINK will not consider symbols that
  178.                  are not declared PUBLIC in an attempt to resolve
  179.                  and undefined symbol consition.
  180.  
  181.                  All symbols in the assembly module that are
  182.                  referenced in the C module must be
  183.                  prototyped/declared as extern in the C module
  184.                  otherwise the compiler will generate undefined
  185.                  symbol errors for such symbols.
  186.  
  187.                  All symbols in the assembly module that will be
  188.                  referenced from a C module must have a underscore
  189.                  prefix.  This naming convention must be used in
  190.                  the assembly module.  You can do this explicitly
  191.                  (_symbol) or you can use:
  192.  
  193.  
  194.  
  195.  
  196.  
  197.  
  198.  
  199.  
  200.  
  201.  
  202.  
  203.  
  204.  
  205.  
  206.   PRODUCT  :  Borland C++                            NUMBER  :  864
  207.   VERSION  :  ANY
  208.        OS  :  NA
  209.      DATE  :  April 2, 1992                           PAGE  :  4/11
  210.  
  211.     TITLE  :  Understanding "Undefined Symbol" Error Messages.
  212.  
  213.  
  214.  
  215.  
  216.                       .model <memory model used>, C
  217.  
  218.                  to specify this implicitly for all symbols.
  219.  
  220.                  IMPORTANT NOTE: If you put underscores in front of
  221.                  your assembly routines and also specify the
  222.  
  223.                       .model <memory model used>, C
  224.  
  225.                  directive, however, the public symbol will be
  226.                  generated with two underscores; consequently an
  227.                  undefined symbol error will be generated.
  228.  
  229.             If all else fails, TDUMP both object modules and note
  230.             any difference between symbols. This will usually
  231.             trigger an insight sufficient to resolve the problem.
  232.             For specific information on using TDUMP.EXE, please
  233.             consult the documentation included with the product.
  234.  
  235.  
  236.        UNDEFINED SYMBOL LINKING C++ WITH C OR ASSEMBLY MODULES
  237.             C++ is a strongly typed language.  In order to support
  238.             type-safe linkage (as well as function overloading),
  239.             Borland C++ must attach information to the symbols
  240.             generated for function names and variables.  When this
  241.             is done, the symbol will no longer match the standard C
  242.             style function name.  In order to link correctly with C
  243.             or assembly modules, the compiler must be notified that
  244.             the symbol is to be in the standard C style (non-
  245.             encoded) rather than employing C++ name-mangling
  246.             (encoded). This is done by prototyping the function as
  247.             type extern "C".  Here is a quick example:
  248.  
  249.                  extern "C" int normal_c_func( float, int, char );
  250.  
  251.             For an additional example, you may want to look at the
  252.             header files which came with the product.  One such
  253.             header file is stdio.h.
  254.  
  255.        UNDEFINED SYMBOL: '_main' IN MODULE C0.ASM
  256.             Every C program must contain a function called main().
  257.             This is the first function executed in your program.
  258.             The function name must be all in lower case. If your
  259.  
  260.  
  261.  
  262.  
  263.  
  264.  
  265.  
  266.  
  267.  
  268.  
  269.  
  270.  
  271.  
  272.   PRODUCT  :  Borland C++                            NUMBER  :  864
  273.   VERSION  :  ANY
  274.        OS  :  NA
  275.      DATE  :  April 2, 1992                           PAGE  :  5/11
  276.  
  277.     TITLE  :  Understanding "Undefined Symbol" Error Messages.
  278.  
  279.  
  280.  
  281.  
  282.             program does not have one, create one. If you are using
  283.             multiple source files, the file that contains the
  284.             function main() must be one of the files listed in the
  285.             Project.
  286.  
  287.             Note that an underscore character '_' is prepended to
  288.             all external Turbo C++ symbols.
  289.  
  290.             In addition to an absent, misspelled or mis-cased
  291.             symbol main, there are two additional common causes:
  292.  
  293.                  The "generate underbars" option is disabled.
  294.  
  295.                  The Pascal calling Convention rather than the C
  296.                  calling convention is selected.
  297.  
  298.  
  299.        UNDEFINED SYMBOL: A PSEUDO REGISTER (ie. _AX)
  300.             Pseudo registers are only allowed in the Turbo C++ and
  301.             ANSI modes of the compiler. You can change this setting
  302.             in the Options | Compiler | Source menu.
  303.  
  304.  
  305.        UNDEFINED SYMBOL: 'FIWRQQ'
  306.             Your program uses floating point routines directly (or
  307.             indirectly) and you have NONE selected for floating
  308.             point. OR, you are using TLINK and have forgotten to
  309.             include EMU.LIB or FP87.LIB on the command line.
  310.  
  311.  
  312.        UNDEFINED SYMBOL: AN IOSTREAM CLASS MEMBER
  313.             If you are using the Integrated Development Enviroment
  314.             simply turn off Options | Compiler | Code Generation |
  315.             Unsigned Characters.
  316.  
  317.             If you are using the command line compiler simply
  318.             remove the '-K' option.
  319.  
  320.  
  321.        UNDEFINED SYMBOL: 'abort()'
  322.             The sole purpose of abort is to print the error message
  323.  
  324.                  "Abnormal Program Termination"
  325.  
  326.  
  327.  
  328.  
  329.  
  330.  
  331.  
  332.  
  333.  
  334.  
  335.  
  336.  
  337.  
  338.   PRODUCT  :  Borland C++                            NUMBER  :  864
  339.   VERSION  :  ANY
  340.        OS  :  NA
  341.      DATE  :  April 2, 1992                           PAGE  :  6/11
  342.  
  343.     TITLE  :  Understanding "Undefined Symbol" Error Messages.
  344.  
  345.  
  346.  
  347.  
  348.             and exit the program with an error code of 3. This
  349.             function is located in the startup code C0.ASM.  Linker
  350.             errors indicating that abort() is an undefined symbol
  351.             are only possible if the standard startup code is not
  352.             being linked into a project.  Although this is not
  353.             common is routine C/C++ development exercises, it is to
  354.             be expected when linking in code written other
  355.             languages such Microsoft Fortran, and Clipper and in
  356.             cases where embedded systems are being developed.
  357.  
  358.             To resolve the undefined symbol, extract the abort()
  359.             function from the startup code and make a separate
  360.             object out of it to be linked into the project.
  361.  
  362.  
  363.        UNDEFINED SYMBOL: '_exitclean()'
  364.             There is a function called _exitclean which is new to
  365.             Turbo C++.  Users moving from Turbo C 2.0 to Turbo C++
  366.             may encounter _exitclean() as an undefined symbol at
  367.             link time. _exitclean() is defined in the Turbo C++
  368.             startup code.  Users creating embedded system (rommable
  369.             code), who do not use the standard Turbo C++ startup
  370.             code, are likely to encounter _exitclean() as an
  371.             undefined symbol.  These users can strip the function
  372.             from the C0.ASM file and create a separate .OBJ file
  373.             which can be linked.  Another option would be to
  374.             purchase the TC++ RTL source and make the necessary
  375.             adjustments.
  376.  
  377.  
  378.        UNDEFINED SYMBOL: LLSH or SCOPY or FMUL or FDIV
  379.             The helper functions have changed their names from
  380.             Turbo C 2.0 to Turbo C++.  This can lead to many
  381.             undefined symbol issues.
  382.  
  383.             When LLSH or SCOPY or FMUL or FDIV (note no underscores
  384.             here) appear as undefined symbols at link time, it is
  385.             likely that an object module or library has code
  386.             generated a call to some helper function from the
  387.             Turbo C 2.0 libraries.  The solution is to simply
  388.             recompile all objects from source.  You can do this by
  389.             choosing Comple | BuildAll from the menu in the
  390.             Integrated Development Environment.
  391.  
  392.  
  393.  
  394.  
  395.  
  396.  
  397.  
  398.  
  399.  
  400.  
  401.  
  402.  
  403.  
  404.   PRODUCT  :  Borland C++                            NUMBER  :  864
  405.   VERSION  :  ANY
  406.        OS  :  NA
  407.      DATE  :  April 2, 1992                           PAGE  :  7/11
  408.  
  409.     TITLE  :  Understanding "Undefined Symbol" Error Messages.
  410.  
  411.  
  412.  
  413.  
  414.        UNDEFINED SYMBOL: STATIC POINTER TO A CLASS MEMBER FUNCTION
  415.             Any static member of a class must be initialized
  416.             otherwise that static member generates an undefined
  417.             symbol error.  The following is an example of how to
  418.             initialize a static pointer to class member function of
  419.             a class is initialized:
  420.  
  421.             // When testing static member initialization, you must
  422.             // declare an instance of the class in a main function;
  423.             // otherwise, the linker has no reference which it must
  424.             // try to resolve, and the undefined symbol error will
  425.             // not be seen - thus you won't know that your
  426.             // initialization was in error.
  427.  
  428.             #include <iostream.h>
  429.  
  430.             // used to allow global initialization of static member
  431.             // pointer
  432.             typedef void (*fptr)();
  433.  
  434.             // declare class containing static members
  435.             class First
  436.             {
  437.               public:
  438.                  static fptr statptr;
  439.             };
  440.  
  441.             // initialize static members of class First
  442.             fptr First::statptr = NULL;
  443.  
  444.             int main(void)
  445.             {
  446.                  First fVar;
  447.  
  448.                  if (fVar.statptr == NULL)
  449.                       cout << "fVar.statptr is NULL: " <<
  450.                       fVar.statptr << endl;
  451.  
  452.                  return 0;
  453.             } // end of main()
  454.  
  455.  
  456.        UNDEFINED SYMBOLS WHEN LINKING WHELLO.CPP
  457.  
  458.  
  459.  
  460.  
  461.  
  462.  
  463.  
  464.  
  465.  
  466.  
  467.  
  468.  
  469.  
  470.   PRODUCT  :  Borland C++                            NUMBER  :  864
  471.   VERSION  :  ANY
  472.        OS  :  NA
  473.      DATE  :  April 2, 1992                           PAGE  :  8/11
  474.  
  475.     TITLE  :  Understanding "Undefined Symbol" Error Messages.
  476.  
  477.  
  478.  
  479.  
  480.             Undefined symbol messages when linking WHELLO.CPP are
  481.             generated when TLINK 3.0 is used rather than 4.0 or
  482.             5.0.  To resolve this problem insure that you are using
  483.             the latest version of TLINK that was included with the
  484.             product.
  485.  
  486.  
  487.        UNDEFINED SYMBOL IN "USER INTERFACES IN TURBO C++" DEMO
  488.             The demo that accompanies the book "Graphic User
  489.             Interfaces for Turbo C++" compiles fine under Turbo C++
  490.             but will not compile Borland C++; undefined symbols
  491.             error messages are generated link for three member
  492.             functions defined in the PianoPage class.
  493.  
  494.             There is a difference between how TC++ and BC++
  495.             implement the C++ specification.  BC++ 2.0 requires
  496.             that you define the static member variables at file
  497.             scope.  That is, outside any function or class, you
  498.             need a line like:
  499.  
  500.                  int PianoPage::recorder_mode = 0;
  501.  
  502.             and similarly for the other two statics.
  503.  
  504.  
  505.        UNDEFINED SYMBOL: '_WSPRINTF'
  506.             Turn off the "Case-sensitive exports" and "Case-
  507.             sensitive link" options. If you are using the command
  508.             linker, don't use the /c switch.  If you are invoking
  509.             the linker from the BCC(x) command line, use the -lc-
  510.             switch. If you are using the IDE, go to the linker
  511.             options dialog box and turn off the case sensitivity
  512.             switch.
  513.  
  514.        UNDEFINED SYMBOL: 'fidrqq'
  515.             You will get undefined symbol fidrqq when using the
  516.             Integrated Development Environment if you have the
  517.             Options | Compiler | Code Generation | More |
  518.             Floating Point Option set to NONE and you are using
  519.             floating point arithmetic in your program.  In order to
  520.             best solve this problem you must set the IDE option for
  521.             Floating Point to either the emulation choice or to the
  522.             80x87 choice.  Note that if you choose an 80x87 setting
  523.  
  524.  
  525.  
  526.  
  527.  
  528.  
  529.  
  530.  
  531.  
  532.  
  533.  
  534.  
  535.  
  536.   PRODUCT  :  Borland C++                            NUMBER  :  864
  537.   VERSION  :  ANY
  538.        OS  :  NA
  539.      DATE  :  April 2, 1992                           PAGE  :  9/11
  540.  
  541.     TITLE  :  Understanding "Undefined Symbol" Error Messages.
  542.  
  543.  
  544.  
  545.  
  546.             the application generated by the compiler will require
  547.             an 80x87 chip to be present at runtime.  Use this
  548.             setting only when truly appropriate.
  549.  
  550.  
  551.        UNDEFINED SYMBOL IN WINDOWS.H
  552.             Make sure you are using the windows.h file that came
  553.             with Borland C++, NOT the windows.h that came with the
  554.             Microsoft Windows SDK. If you include the Microsoft
  555.             windows.h file you will get many undefined symbols
  556.             including WINMAIN in caps and translatemessage in lower
  557.             case.  Use our windows.h file instead of Microsoft's
  558.             when you are using our compiler.
  559.  
  560.  
  561.        UNDEFINED SYMBOL USING TCLASDLL.LIB
  562.             To use the DLL version of the container class library
  563.             you must do ALL of the following:
  564.  
  565.                  use the large memory model
  566.  
  567.                  use Smart Callbacks
  568.  
  569.                  turn case sensitive link ON
  570.  
  571.                  turn case sensitive exports ON
  572.  
  573.                  use the DLL version of the RTL
  574.  
  575.                  define _CLASSDLL
  576.  
  577.  
  578.        UNDEFINED SYMBOL USING SELECTORS PROVIDED BY WINDOWS
  579.             If you are using _C000h or other selectors provided by
  580.             Windows and they are coming up as undefined symbols,
  581.             perhaps you are compiling in C++ mode and forgot to
  582.             extern "C" them.
  583.  
  584.             Programming in C:
  585.                  extern WORD _C000h
  586.  
  587.             Programming in C++:
  588.                  extern "C" WORD _C000h
  589.  
  590.  
  591.  
  592.  
  593.  
  594.  
  595.  
  596.  
  597.  
  598.  
  599.  
  600.  
  601.  
  602.   PRODUCT  :  Borland C++                            NUMBER  :  864
  603.   VERSION  :  ANY
  604.        OS  :  NA
  605.      DATE  :  April 2, 1992                          PAGE  :  10/11
  606.  
  607.     TITLE  :  Understanding "Undefined Symbol" Error Messages.
  608.  
  609.  
  610.  
  611.  
  612.        UNDEFINED SYMBOL: 'ChangeSelector'
  613.             The Windows API function ChangeSelector() has the wrong
  614.             name in KERNEL.EXE for Windows 3.0, and therefore in
  615.             IMPORT.LIB.   The name given to this function (this is
  616.             NOT a joke) is PrestoChangoSelector().
  617.  
  618.             Use PrestoChangoSelector() in your program in place of
  619.             ChangeSelector() and all will be well.
  620.  
  621.  
  622.        UNDEFINED SYMBOLS USING THE OBJECTWINDOWS LIBRARY (OWL)
  623.             If you get the undefined symbols
  624.  
  625.                  TApplication(unsigned char far *, unsigned int,
  626.                  unsingned int, unsigned char far *, int )
  627.  
  628.             and
  629.  
  630.                  TWindow::TWindow(TWindowsObject near *, unsinged
  631.                  char far *, TModule near *)
  632.  
  633.             when linking an OWL application it could be because you
  634.             have forced unsigned characters.  The functions in the
  635.             .lib take signed characters and thus if you compile to
  636.             use unsigned characters, the symbols will not match.
  637.  
  638.             Using the Integrated Development Environment be sure to
  639.             turn off Options | Compiler | Code Generation |
  640.             Unsigned Characters.
  641.  
  642.             If you are using the command line compiler be sure to
  643.             remove the -K option to solve this problem.
  644.  
  645.  
  646.        UNDEFINED SYMBOL: 'Object::new(unsigned int)'
  647.             You forgot to link with the TCLASDLL.LIB file where it
  648.             is defined!
  649.  
  650.             Basically the problem is that you are mixing both
  651.             STATIC and DYNAMIC LINK libraries into the application.
  652.             You must use only one or the other.  If you are working
  653.             in the IDE, change the LINKER options section for
  654.             libraries.
  655.  
  656.  
  657.  
  658.  
  659.  
  660.  
  661.  
  662.  
  663.  
  664.  
  665.  
  666.  
  667.  
  668.   PRODUCT  :  Borland C++                            NUMBER  :  864
  669.   VERSION  :  ANY
  670.        OS  :  NA
  671.      DATE  :  April 2, 1992                          PAGE  :  11/11
  672.  
  673.     TITLE  :  Understanding "Undefined Symbol" Error Messages.
  674.  
  675.  
  676.  
  677.  
  678.             If you are using the command line compiler and linker,
  679.             just be sure to specify the correct set of library
  680.             files.  For specific information on the "correct set of
  681.             library files" please see the documentation included
  682.             with the product as library names tend to change from
  683.             version to version.
  684.  
  685.  
  686.  
  687.  
  688.  
  689.  
  690.  
  691.  
  692.  
  693.  
  694.  
  695.  
  696.  
  697.  
  698.  
  699.  
  700.  
  701.  
  702.  
  703.  
  704.  
  705.  
  706.  
  707.  
  708.  
  709.  
  710.  
  711.  
  712.  
  713.  
  714.  
  715.  
  716.  
  717.  
  718.  
  719.  
  720.  
  721.  
  722.  
  723.  
  724.  
  725.  
  726.  
  727.