我想提供一个提供模板代码的库。但当我可以猜测模板的不同常用类型的用法时,我也想尽可能保留此代码(生成的代码)的所有权。这是我正在尝试做的事情的一个例子:
lib1.h
#include <iostream>
template<int N>
void print_me() {
std::cout << "I am function number " << N << std::endl;
}
lib1.cpp
#include "lib1.h"
/* Force symbols to be defined here. */
template void print_me<0>();
template void print_me<1>();
我使用以下方法编译我的库:
g++ -shared -fPIC lib1.cpp -o lib1.so
当我使用我的图书馆时:
main.cpp
#include <lib1.h>
int main() {
print_me<0>();
print_me<1>();
print_me<2>();
}
编译为:
g++ main.cpp -l1
在这里,我希望符号 print_me() 和 print_me() 是从 lib1.so 定义和使用的,而 print_me() 定义并用于我的可执行文件(使用 nm --define-only 检查)。但似乎事实并非如此! 0 和 1 的符号在 lib1.so 中定义良好,但如下所示weak符号。并且再次在我的可执行文件(0、1 和 2)中重新定义,很弱。这意味着我的可执行文件的 0 和 1 的代码取自 main.cpp,这不是我想要的(我检查了 main.cpp 中的规范)。
有没有办法(例如在 lib1.h 中)在 main.cpp 的编译时说符号已经在某处定义并且不需要添加这些符号?
C++11解决方案:使用外部模板。只需将这些字符串添加到您的main.cpp
file:
extern template void print_me<0>();
extern template void print_me<1>();
因此你告诉编译器不要实例化print_me
函数模板在main.cpp
(对于模板参数 0 和 1)。所以链接器应该搜索定义void print_me<0>();
and void print_me<1>();
在其他翻译单位。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)