veces varsol una toda sucia saca ropa remojando puede noche muy lavar lavadora dejar daña cuantas con como automatica agua objective-c xcode linker clang osx-mountain-lion

objective c - varsol - Error de enlace para funciones en línea



se puede dejar remojando la ropa en la lavadora (1)

Estoy tratando de compilar el código de ejemplo "SonofGrab" usando XCode 4.5.1 en OS X 10.8.

Una función se define así en controller.m

inline uint32_t ChangeBits(uint32_t currentBits, uint32_t flagsToChange, BOOL setFlags);

Esto conduce a este mensaje de error:

Undefined symbols for architecture x86_64: "_ChangeBits", referenced from: -[Controller awakeFromNib] in Controller.o [...] ld: symbol(s) not found for architecture x86_64

La eliminación de la incorporación de la función ChangeBits resuelve el problema, pero ¿por qué el enlazador no encuentra a Changebits con la definición original?


Eso para mí, parece un error. Este simple caso exhibe el mismo error:

inline void foo() {} int main() { foo(); }

Rendimientos:

$ clang test-inline.c Undefined symbols for architecture x86_64: "_foo", referenced from: _main in test-inline-MfUY0X.o ld: symbol(s) not found for architecture x86_64 clang: error: linker command failed with exit code 1 (use -v to see invocation)

¡¿Eso tiene que estar mal ?! A menos que me esté perdiendo algo sobre la inline .

Edit: Oh no, espera, mira esto - http://clang.llvm.org/compatibility.html#inline

Básicamente parece que no entendí completamente en inline , tampoco. ¡Y tampoco la persona que escribe ese código de muestra en Apple!

La inline en la función ChangeBits significa que esa definición se debe usar solo para la alineación. No es que la función siempre deba estar en línea. Debe haber otra definición no en línea disponible en otro lugar de la aplicación, de lo contrario es ilegal. Por lo tanto, se proporciona el error de enlace, ya que no se proporcionan ChangeBits no en línea.

La solución real es declarar los ChangeBits como en static inline ya que eso le dice al compilador que la definición es local solo para esa unidad de traducción y por lo tanto no es necesario que haya una definición sin línea.

Sin embargo, más información en la página de LLVM a la que he vinculado. ¡Espero que ayude!