小编Kla*_*ing的帖子

共享库中库函数的选择性静态链接

我想创建一个使用第三方静态库中的函数的共享库.例如,foobarlibfoobar.a.我知道我的主要应用程序也在使用foo并将导出该符号.所以我只是想链接bar以保存代码大小并保持'foo'未解析(因为它将由主应用程序提供).如果我包含libfoobar.a,链接器ld将在我的共享库中包含这两个函数.如果我不包括libfoobar.a,我的库将无法访问功能,bar因为应用程序本身没有链接bar.问题:

  • 有没有办法告诉ld在构建共享库时只解析某些符号?
  • 打开libfoobar.a到一个共享库?
  • 提取包含文件功能barlibfoobar.a,并指定在连接线?
  • 不用担心,运行时加载器bar将从您的应用程序中使用,因此bar不会加载共享库中的副本?

linux shared-libraries ld static-linking

7
推荐指数
1
解决办法
4827
查看次数

使用规则插入辅助表自动递增序列

要在第二个表中自动添加列以通过唯一索引将其绑定到第一个表,我有一个如下规则:

CREATE OR REPLACE RULE auto_insert AS ON INSERT TO user DO ALSO
INSERT INTO lastlogin (id) VALUES (NEW.userid);
Run Code Online (Sandbox Code Playgroud)

如果user.userid是一个整数,这可以正常工作.但是,如果它是一个序列(例如,类型为serialbigserial),那么插入到lastlogin表中的是下一个序列id.所以这个命令:

INSERT INTO user (username) VALUES ('john');
Run Code Online (Sandbox Code Playgroud)

将列[1,'john',...]插入用户,但将列[2,...]插入lastlogin.以下2个解决方法确实有效,但第二个解决方案消耗了两倍的序列号,因为序列仍然是自动递增的:

CREATE OR REPLACE RULE auto_insert AS ON INSERT TO user DO ALSO
INSERT INTO lastlogin (id) VALUES (lastval());

CREATE OR REPLACE RULE auto_insert AS ON INSERT TO user DO ALSO
INSERT INTO lastlogin (id) VALUES (NEW.userid-1);
Run Code Online (Sandbox Code Playgroud)

不幸的是,如果我插入多行,解决方法不起作用:

INSERT INTO user (username) …
Run Code Online (Sandbox Code Playgroud)

postgresql rules

5
推荐指数
1
解决办法
3849
查看次数

功能声明中是否有C语法的功能指针

而不是为函数声明函数指针typedef,是否可以从函数声明中获取它?

通常情况下,

int foo(int x);
typedef int (*fooFunc)(int);
fooFunc aFunc;
Run Code Online (Sandbox Code Playgroud)

我想要的是:

int foo(int x);
foo* aFunc;
Run Code Online (Sandbox Code Playgroud)

我想将它用于dlsym:

foo* aFunc;
aFunc = dlsym(lib, "foo");
aFunc(x);
Run Code Online (Sandbox Code Playgroud)

如果我更新foo并忘记更新fooFunc,反之亦然,那将是不好的.此外,我可能有许多函数,维护函数声明和与这些函数关联的函数指针typedef会更加有效.

结论:AndreyT的答案是最便携的,但如果您编写gcc代码,那么typeof是一个很好的解决方案.

c typedef function-pointers

4
推荐指数
2
解决办法
1740
查看次数