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!