So, if I understand your comment, the code currently have binarystoragebuffer.cc: inline void BinaryStorageBuffer::store (void* stream, unsigned int nb_bytes) binarystoragebuffer.h: void store (void* stream, unsigned int nb_bytes); And it would be better to either have: binarystoragebuffer.cc: void BinaryStorageBuffer::store (void* stream, unsigned int nb_bytes) binarystoragebuffer.h: void store (void* stream, unsigned int nb_bytes); Or: binarystoragebuffer.cc: inline void BinaryStorageBuffer::store (void* stream, unsigned int nb_bytes) binarystoragebuffer.h: inline void store (void* stream, unsigned int nb_bytes); Am I understanding this right? Should I contact the dev about this? Thank you all for your help! Pierre Le mercredi 1 avril 2020, 19:44:04 CEST Jason Craig a écrit :
On 4/1/2020 11:18, Jan Engelhardt wrote:
On Wednesday 2020-04-01 18:24, Pierre wrote:
/usr/lib64/gcc/x86_64-suse-linux/9/../../../../x86_64-suse-linux/bin/ld: ttbdmi.cc:(.text+0x46e): undefined reference to `BinaryStorageBuffer::store(void*, unsigned int)' /usr/lib64/gcc/x86_64-suse-linux/9/../../../../x86_64-suse-linux/bin/ld: ttbdmi.cc:(.text+0x48b): undefined reference to `BinaryStorageBuffer::store(void*, unsigned int)' /usr/lib64/gcc/x86_64-suse-linux/9/../../../../x86_64-suse-linux/bin/ld: ttbdmi.cc:(.text+0x4a8): undefined reference to `BinaryStorageBuffer::store(void*, unsigned int)' /usr/lib64/gcc/x86_64-suse-linux/9/../../../../x86_64-suse-linux/bin/ld: ttbdmi.cc:(.text+0x4c5): undefined reference to `BinaryStorageBuffer::store(void*, unsigned int)' /usr/lib64/gcc/x86_64-suse-linux/9/../../../../x86_64-suse-linux/bin/ld: src/ttbdmi.o:ttbdmi.cc:(.text+0x4e2): more undefined references to `BinaryStorageBuffer::store(void*, unsigned int)' follow
I don't understand why the "undefined reference" is coming up here (binarystoragebuffer.cc has been compiled into an .o object and should link without a problem?)
Your .o file does not contain the function in question.
abuild@a4:~/rpmbuild/BUILD/Nemo-2.3.51> nm -C src/binarystoragebuffer.o | grep ::store
The reason for that being that store() is defined "inline" in binarystoragebuffer.c. Inline means to replace the function call with the body of the function wherever it is called. This means you need to have the body of the function in the header file (binarystoragebuffer.h), not a source file. By the time the source file is compiled and linking is happening, it is too late to inline a function.
So I'd guess that in the other versions gcc has ignored the inline and treated it as a normal function, whereas the Tumbleweed x86_64 has honored the inline and dropped the function from the object file.
To fix it, the simplest way is to remove "inline" from the function definition. You could also move the inline definition to the header file, but as demonstrated this function is fairly unlikely to actually be inlined by the compiler.
-- Jason Craig
-- To unsubscribe, e-mail: opensuse-packaging+unsubscribe@opensuse.org To contact the owner, e-mail: opensuse-packaging+owner@opensuse.org