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

2023-12-07

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

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(使用前将#替换为@)

强制定义库中 C++ 模板实例的符号 的相关文章

随机推荐

  • 如何将多域用户电子邮件添加到 Azure AD

    我们有三个不同的网站 我们希望使用 Azure AD 来实现单点登录 我的问题是如何将可能拥有不同电子邮件地址的用户添加到 Azure AD 通过 API 例如 电子邮件受保护 电子邮件受保护 电子邮件受保护 etc 当我尝试通过 API
  • 如何在 Eclipse 编辑器中打开外部浏览器

    如何以编程方式使用 Eclipse 插件中的打开选项打开 Safari 等外部浏览器 try PlatformUI getWorkbench getBrowserSupport getExternalBrowser openURL new
  • 使用 PHP 创建 Web 服务

    我想用 PHP 创建一个可供不同消费者 网页 Android 设备 iOS 设备 使用的 Web 服务 我来自 Microsoft 背景 因此对如何使用 C 等进行操作很满意 理想情况下 我希望能够提供可以发送 JSON 的 REST 服务
  • 如何使用 React 导航在 mobx 商店中导航?

    我可以用this props navigation从屏幕组件进行导航 我应该如何在 mobx 存储文件中执行类似操作 或者我应该在商店中进行导航吗 我读了无需导航道具即可导航文章 但它似乎只适用于屏幕组件 对吗 有人说用global变量来存
  • 具有选择类的语义 UI 多级下拉列表不会展开

    当我尝试使用下拉菜单时search selection并选择一个子类别 它会展开到自身中 并且下拉列表中会出现一个小滚动条 如果我不添加search selection它似乎运行得很好 JSFiddle https jsfiddle net
  • JavaScript 图像 URL 验证

    我需要验证图像 url 以检查该 url 是否是以下任何扩展名的图像 jpeg jpg gif png 示例 当我们验证此 url 时http www example com asdf jpg它应该给我们真正的价值和像这样的网址http w
  • 有没有办法在热图中保留聚类但减少观察数量?

    我的数据集包含 20 列 90 个观察值 行 我生成了一个非常简洁的热图 它使用 pheatmap 包将我的数据分为两组 虽然它并不完全干净 但树状图的两个簇几乎根据我的条件将我的样本分为两个不同的组 现在我想将这组 90 个观察值减少到大
  • 单引号和双引号 html 属性之间的功能差异是什么?

    Let sEncodedHref代表一个HttpUtility HtmlAttributeEncode 是字符串 生成的 html 之间是否存在功能差异 如下所示 String Format span class blue src 0 sE
  • 从 netcdf 中提取特定经纬度的值

    我正在尝试读入 R 的 netCDF 文件 网络CDFchirps v2 0 1981 days p05 nc是从这里下载的 ftp ftp chg ucsb edu pub org chg products CHIRPS 2 0 glob
  • 反转字符串顺序

    我想反转字符串的顺序 例如 乔 红 红乔 我相信相反的方法对我没有帮助 因为我不想反转每个字符 只是切换单词 首先 您需要定义 单词 的含义 我假设您只需要用空格分隔的字符串 在这种情况下 我们可以这样做 join reversed s s
  • 如何在pygame中使用其他字体?

    我已经下载了一种名为 redline ttf 的字体 我想在 pygame 中使用它 我只想在屏幕上打印文本 我在文件夹 pygame gt lib 中找到了一种名为 freesansbold ttf 的基本字体 我已将下载的字体放在同一个
  • 使用 jQuery 使用值和类根据复选框过滤结果

    首先 这是我现在所拥有的一些东西 链接到 JSFiddle 代码如下 div div div div
  • 订阅确认时出现 Amazon SNS SDK 无效参数异常

    我正在尝试使用以下代码订阅 Android 用户接收推送通知 public static void subscribeToTopic final String topicArn String EndpointArn SubscribeReq
  • 在 rmarkdown::render 之外初始化输出位置

    米科 马蒂拉帮助我找到了一种动态时间戳文件的方法 使用working代码如下 title Untitled author Jane Doe date r Sys Date output word document knit gt funct
  • Meteor Collectionfs插入服务器端

    大家好 我使用 collectionfs gridfs cfs 文件系统 在 collectionfs 文档中 我找到了如何在客户端插入文件 如下所示 Template myForm events change myFileInput fu
  • 在生产中使用 MemoryStore

    今天 我第一次在 生产 模式下运行 Node js 应用程序 并收到以下警告 Warning connection session MemoryStore is not designed for a production environme
  • 使用 lapply 和两个参数运行滞后回归

    我正在运行多个单变量回归 就像在这个可重现的示例中一样 require dynlm data USeconomic US lt USeconomic vars lt colnames US 2 a lt lapply colnames US
  • DB2 .Net 连接器错误:AESEncryptADONet

    我有一个非常简单的 Net Core 应用程序尝试创建并打开到 DB2 数据库 在 AS 400 上 的连接 当我尝试创建 DBConnection 对象时出现此错误 并显示以下消息 ERROR 58005 SQL0902 There ar
  • 如何使用 NHibernate 设置正确的事务隔离模式?

    我们已经从 sqlite 切换到 FireBird 嵌入式服务器 因为 FB 貌似支持数据库的并发更新 但是我们有时候 有这些例外 2010 10 28 15 49 31 242 56 ERROR NetworkCatcher Entiti
  • 强制定义库中 C++ 模板实例的符号

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