小编Que*_*tin的帖子

覆盖静态库中的弱符号

我想从多个来源为我的项目创建一个静态.a库,其中一些定义弱函数,另一些实现它们.比方说我有:

lib1.c:

void defaultHandler()
{
    for(;;);
}
void myHandler() __attribute__((weak, alias ("defaultHandler")));
Run Code Online (Sandbox Code Playgroud)

lib2.c:

void myHandler()
{
    /* do my stuff here */
}
Run Code Online (Sandbox Code Playgroud)

然后我想把它们放到一个单独的库中,这样它对于最终应用程序来说似乎是透明的

$ ar -r libhandlers.a lib1.o lib2.o
Run Code Online (Sandbox Code Playgroud)

但是myHandler在libhandler中现在有2个符号:

$ nm libhandlers.a | grep "myHandler"
00000001 W myHandler
00000581 T myHandler
Run Code Online (Sandbox Code Playgroud)

然后在使用lib时,弱引用被链接.我目前唯一的解决方案是不包含在库中,lib2.c而是将其作为源添加到应用程序的Makefile中...这并不令人满意,因为我只想提供几个库而不是一大堆文件.

--whole-archive选项也不令人满意,因为我在嵌入式系统上工作,我不想包含我不需要的所有东西.

有没有办法编译库,以便弱符号消失,如果提供强大的符号?

注意:我正在使用arm-none-eabi-gcc v4.8

c gcc ld unix-ar

8
推荐指数
1
解决办法
4540
查看次数

apollo 的 MockedProvider 没有明确警告缺少模拟

我正在使用 apollo hooks ( useQuery, useMutation)对 React 组件进行单元测试,并且在测试中我使用 apollo 的MockedProvider. 问题是,有时,我的模拟与组件实际进行的查询不匹配(创建模拟时输入错误,或者组件演变并更改了某些查询变量)。发生这种情况时,MockedProvided向组件返回一个 NetworkError。但是在测试套件中,没有显示警告。这令人沮丧,因为有时我的组件对useQuery. 这导致我曾经通过的测试突然无声无息地失败,让我很难找到原因。

这是使用useQuery以下组件的示例:

import React from 'react';
import {gql} from 'apollo-boost';
import {useQuery} from '@apollo/react-hooks';


export const gqlArticle = gql`
  query Article($id: ID){
    article(id: $id){
      title
      content
    }
  }
`;


export function MyArticleComponent(props) {

  const {data} = useQuery(gqlArticle, {
    variables: {
      id: 5
    }
  });

  if (data) {
    return (
      <div className="article">
        <h1>{data.article.title}</h1>
        <p>{data.article.content}</p>
      </div>
    );
  } else { …
Run Code Online (Sandbox Code Playgroud)

unit-testing apollo reactjs react-apollo apollo-client

8
推荐指数
1
解决办法
5012
查看次数

VIM Doxygen 支持 - 在换行符上自动插入星号 (*)

当我写 Doxygen 注释(在 C 文件中)时,我希望在新行中自动插入一个星号(使用o命令或只是 ? )。

像这个例子:

/** 
 * My Doxygen comment being written
Run Code Online (Sandbox Code Playgroud)

当我打?

/**
 * My Doxygen comment bein written
 * 
   ^
 cursor is here
Run Code Online (Sandbox Code Playgroud)

我有 DoxygenToolkit.vim,set syntax=c.doxygen但没有一个能做我想要的。我还发现但不确定它应该做什么,但并没有解决我的问题。我用谷歌搜索过,但没有找到。

任何的想法?

c c++ vim doxygen

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

使用命令`echo -ne"hello \n"`进行Bash vs. Dash行为

echo -ne "hello\n"使用bash和dash 使用相同的命令获得了不同的行为.见下文 :

$ bash -c 'echo -ne "hello\n"'
hello
$ dash -c 'echo -ne "hello\n"'
-ne hello
Run Code Online (Sandbox Code Playgroud)

这是为什么 ?我根本不明白......

我的系统:

$ lsb_release -a
No LSB modules are available.
Distributor ID: Ubuntu
Description:    Ubuntu 12.04.5 LTS
Release:    12.04
Codename:   precise
Run Code Online (Sandbox Code Playgroud)

bash dash-shell

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

joins() 和 where() 请求与自定义表名关联

我有两个型号

专辑.rb

class Album < ActiveRecord::Base
  has_many :tracks
  self.table_name = 'prefix_album'
end
Run Code Online (Sandbox Code Playgroud)

轨道.rb

class Track < ActiveRecord::Base
  belongs_to :album
  self.table_name = 'prefix_track'
end
Run Code Online (Sandbox Code Playgroud)

现在,由于原因,表名带有前缀,所以我的数据库中有prefix_album和表。prefix_track对于基本使用来说,效果很好。

现在出现以下查询的问题:

Album.joins(:tracks).where(tracks: { id: [10, 15] })
Run Code Online (Sandbox Code Playgroud)

结果如下 SQL:

SELECT * FROM "prefix_albums" INNER JOIN "prefix_tracks" ON "prefix_tracks"."album_id" = "prefix_albums"."id" WHERE "tracks"."id" IN (10, 15)
Run Code Online (Sandbox Code Playgroud)

失败是因为WHERE "tracks"."id"应该是WHERE "prefix_tracks"."id"。知道为什么 active_record 能够获取正确的表名.joins(:tracks)但不能获取正确的表名.where(tracks: {})吗?

无论如何,我已经想到了这个锻炼:Album.joins(:tracks).merge(Track.where(id: [10,15]))它给出了相同的结果并且有效。

但我想知道为什么前者不起作用

activerecord ruby-on-rails

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

调用具有太多参数的函数时的GCC行为

我刚刚注意到GCC的行为对我来说似乎很奇怪(没有与其他编译器核对过).

如果我编译这段代码:

#include <stdio.h>

void foo(int i)
{
  printf("Hello %d\n",i);
}

int main(){
  foo(1, 2);
  return 0;
}
Run Code Online (Sandbox Code Playgroud)

我会得到一个编译器错误:

test.c:9:5: error: too many arguments to function ‘foo’
Run Code Online (Sandbox Code Playgroud)

但是如果我编译这段代码:

#include <stdio.h>

void foo()
{
  printf("Hello\n");
}

int main(){
  foo(1, 2);
  return 0;
}
Run Code Online (Sandbox Code Playgroud)

我没有错误或警告.

有人能解释我为什么吗?

我用gcc 4.6.3和arm-none-eabi-gcc 4.8.3测试了这个

编辑:我编译所有警告: gcc -Wall test.c

c gcc

4
推荐指数
1
解决办法
1444
查看次数

突出显示 VIM 中的不间断空格,命令和 .vimrc 之间的不同行为

当我在 VIM 中输入一个时,我希望不间断空格立即突出显示,因为我的键盘布局使我有时会写不间断空格而不是正常空格,然后很难调试。

我发现了一个很酷的技巧,输入命令:

:syntax match ErrorMsg " "
Run Code Online (Sandbox Code Playgroud)

正是我想要的(引号之间的空格是一个不间断的空格)

现在,当我将此命令添加到.vimrc(没有开头的冒号)时,它不起作用……知道吗?

vim

3
推荐指数
1
解决办法
1247
查看次数