我逐渐意识到,在开发 C++ 库时,有时不可避免地将实现代码包含在与库关联的
.h
文件中。这种情况的一个例子是开发方法的 template
、class
等。
我已经明白,某物的
template
会将其所代表的内容从其自身的具体实现转换为编译器在使用 template
背后创建具体实现时要遵循的指令。在库开发的背景下,这告诉我,将 template
方法、class
等的实现代码从声明 template
的文件中移出是不可能的,否则链接库的人将不会拥有在使用 template
背后编译具体实现所需的说明(除其他原因外,无法在与 template
声明不同的文件中拥有 template
的实现代码)。
特别考虑上述示例,如果库附带的一个或多个
.h
文件与库本身的内容不完全匹配,那么链接库的后果是什么?
我已经接受了,如果不在声明这些
template
的文件中包含完整的实现代码,我根本无法向链接库的人提供 .h
的东西,因为它只是不包含否则就没有意义。我还应该补充一点,在我想要实现的目标的更大背景下,我无法具体实现本示例中 template
的所有变体,因为我希望库的链接器能够具体实现它们自己的变体在这些 template
上。也就是说,我只是想知道如果链接库的人试图篡改 template
文件会发生什么。编译会失败吗?链接会失败吗?构建会成功并产生大量运行时错误吗?我会在 MRE 中测试自己,但我对库开发没有足够的信心,无法知道 MRE 的任何结果本身是否是我自己无能的结果。感谢您的阅读!
它可能会以无法预见的方式崩溃和燃烧。
如果 ABI 的唯一区别在于您不使用的符号之间,那么它可能会起作用。
它甚至可能无法生成可以链接的代码,因此您甚至可能无法生成二进制文件。
所以,这要看情况。