c++ inline linker-errors

c++ - Error del enlazador de función en línea



inline linker-errors (5)

Estoy tratando de usar funciones miembro en línea de una clase en particular. Por ejemplo, la declaración de la función y la implementación sin inlining es como tal:

en el archivo de cabecera:

int GetTplLSize();

en el archivo .cpp:

int NeedleUSsim::GetTplLSize() { return sampleDim[1]; }

Por alguna razón, si pongo la palabra clave "en línea" en cualquiera de la implementación y la declaración, así como en ambos lugares, obtengo errores de vinculador como se muestra:

Creating library C:/DOCUME~1/STANLEY/LOCALS~1/TEMP/MEX_HN~1/templib.x and object C:/DOCUME~1/STANLEY/LOCALS~1/TEMP/MEX_HN~1/templib.exp mexfunction.obj : error LNK2019: unresolved external symbol "public: int __thiscall NeedleUSsim::GetTplLSize(void)" (?GetTplLSize@NeedleUSsim@@QAEHXZ) referenced in function _mexFunction mexfunction.mexw32 : fatal error LNK1120: 1 unresolved externals C:/PROGRA~1/MATLAB/R2008B/BIN/MEX.PL: Error: Link of ''mexfunction.mexw32'' failed.

¿Qué debe ser para deshacerse de este error (es decir, qué estoy haciendo mal en términos de hacer estas funciones de miembro en línea)?


Como otros ya han señalado, debe mover la definición de la función en línea al archivo de encabezado, así:

class NeedleUSsim { // ... inline int GetTplLSize() { return sampleDim[1]; } // ... };

La razón de esto es que el compilador necesita saber qué código debe estar en línea cuando ve una llamada a la función en línea. Si deja la definición de la función en el archivo .cpp para la clase NeedleUSsim, el código que genera el compilador queda atrapado en el archivo de objeto NeedleUSsim. Como el compilador solo lee el código fuente (nunca se asoma al archivo de objeto de otra clase) simplemente no tiene forma de saber qué código reemplaza una llamada cuando compila otro archivo .cpp.


Necesitas poner la definición de la función en el encabezado. La forma más sencilla de insinuar al compilador en línea es incluir el cuerpo del método en la declaración de clase como:

class NeedleUSsim { // ... int GetTplLSize() const { return sampleDim[1]; } // ... };

O, si insistes en una declaración y definición separadas:

class NeedleUSsim { // ... int GetTplLSize() const; // ... }; inline int NeedleUSsim::GetTplLSize() const { return sampleDim[1]; }

La definición debe estar visible en cada unidad de traducción que use ese método.


Si tiene una función en línea, debe colocar la definición en el archivo de encabezado.


Ver el lenguaje de la macro de la Guardia en línea . Esto le permitirá al menos separar, aunque sea levemente, el código de la declaración. También le permite alternar el ingreso de funciones a través de un define .