gpt4 book ai didi

c++ - 为库中的 C++ 模板实例强制定义符号

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:23:33 27 4
gpt4 key购买 nike

我想提供一个提供模板代码的库。但是当我可以猜测我的模板的不同常用类型的用法时,我也想尽可能保留此代码(生成的代码)的所有权。这是我正在尝试做的一个例子:

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>() 是从 lib1.so 定义和使用的,而 print_me<2>() 是为我的可执行文件定义和使用的(用 nm 检查 --仅定义)。但是好像不是这样的! 0 和 1 的符号在 lib1.so 中有很好的定义,但作为 符号。并再次在我的可执行文件(0、1 和 2)中重新定义,很弱。这意味着我的可执行文件的 0 和 1 代码取自 main.cpp,这不是我想要的(我检查了 main.cpp 中的规范)。

有没有办法(例如在 lib1.h 中)在 main.cpp 的编译时说符号已经在某处定义并且不需要添加这些符号?

最佳答案

C++11 解决方案:使用 extern templates .只需将这些字符串添加到您的 main.cpp文件:

extern template void print_me<0>();
extern template void print_me<1>();

因此你告诉编译器不要实例化print_me main.cpp 中的函数模板| (对于模板参数 0 和 1)。所以链接器应该搜索 void print_me<0>(); 的定义和 void print_me<1>();在其他翻译单位。

关于c++ - 为库中的 C++ 模板实例强制定义符号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21481864/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com