我想提供一个提供模板代码的库。但是当我能猜到我的模板的不同常用类型的用法时,我也想尽可能地保留这段代码(生成的代码)的所有权。这是我正在尝试做的一个例子:
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
当我使用我的图书馆时:
主文件
#include <lib1.h>
int main() {
print_me<0>();
print_me<1>();
print_me<2>();
}
编译:
g++ main.cpp -l1
在这里,我希望符号 print_me<0>() 和 print_me<1>() 是从 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 的编译时说符号已经在某处定义并且不需要添加这些符号?