我想提供一个提供模板代码的库。但是,当我能够猜测不同类型的模板的使用情况时,我也想尽可能保留此代码的所有权(生成的代码)。这里是什么,我试图做一个例子:为库中的C++模板实例强制定义符号
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 < 0>()和print_me < 1>()被定义和使用from lib1.so和print_me < 2>()定义并用于我的可执行文件(使用nm --defined-only进行检查)。但似乎并非如此! 0和1的符号在lib1.so中有明确的定义,但是符号如弱符号。并且在我的可执行文件(0,1和2)中重新定义为弱。这意味着我的可执行文件的代码为0和1取自main.cpp,这不是我想要的(我使用main.cpp中的规范进行了检查)。
有没有一种方法(例如在lib1.h中)在main.cpp的编译时说这些符号已经在某处定义了,并且它不需要添加这些符号?
为什么你需要这样的东西?您的图书馆和用户都共享相同的模板(和专业化!)。定义模板意味着编译渴望而不是deamnd(懒惰)。虽然你的lib和你的用户代码的print_me <0>完全一样,但是它们生成的模板是一样的。 – Paranaix
是否声明'template <> void print_me <0>(); template <> void print_me <1>();'在标题帮助? – Jarod42
是否可以使用C++ 11功能? – Constructor