我想从多个来源为我的项目创建一个静态.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
我正在使用 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) 当我写 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但没有一个能做我想要的。我还发现,但不确定它应该做什么,但并没有解决我的问题。我用谷歌搜索过,但没有找到。
任何的想法?
我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) 我有两个型号
专辑.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]))它给出了相同的结果并且有效。
但我想知道为什么前者不起作用
我刚刚注意到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
当我在 VIM 中输入一个时,我希望不间断空格立即突出显示,因为我的键盘布局使我有时会写不间断空格而不是正常空格,然后很难调试。
我发现了一个很酷的技巧,输入命令:
:syntax match ErrorMsg " "
Run Code Online (Sandbox Code Playgroud)
正是我想要的(引号之间的空格是一个不间断的空格)
现在,当我将此命令添加到.vimrc(没有开头的冒号)时,它不起作用……知道吗?
c ×3
gcc ×2
vim ×2
activerecord ×1
apollo ×1
bash ×1
c++ ×1
dash-shell ×1
doxygen ×1
ld ×1
react-apollo ×1
reactjs ×1
unit-testing ×1
unix-ar ×1