精华内容
下载资源
问答
  • 公司有个任务需要编译60个c语言小程序,工程目录结构为: ...makefile不太熟,也很菜,我第一想法用for循环进行循环编译用到了makefile自定义函数,贴代码:CC = arm-linux-gccCFLAGS +=-Wall -O -D_REENTRANT -f

    公司有个任务需要编译60个c语言小程序,工程目录结构为:
    src:放所有小程序源文件.c
    drv:所有小程序编译后都为对应.drv
    其它头文件、库目录省略。

    makefile不太熟,也很菜,我第一想法是用for循环进行循环编译,还用到了makefile自定义函数,贴代码:

    CC = arm-linux-gcc
    
    CFLAGS +=-Wall -O -D_REENTRANT -fpic -shared
    LDFLAGS += -L./lib -lutility -lcrc -lmxml -lserial -lsocket -lpthread
    
    ROOT_DIR = $(shell pwd)
    SRC_DIR = ./src
    DRV_DIR = ./drv
    #src/*.c 
    SRC := $(wildcard ${SRC_DIR}/*.c) 
    SRC1 := $(notdir $(SRC))
    ALL_NAME := $(basename ${SRC1})
    
    #自定义了一个compile_file函数
    define compile_file
            $(CC) $(CFLAGS) -o $1 $2 $(LDFLAGS)
    endef
    
    default:
            for name in $(ALL_NAME); do \
    #这里调用自定义函数,传输两个参数:一个drv/xx.drv,一个src/xx.c
            ${call compile_file, $(DRV_DIR)/$$name.drv, $(SRC_DIR)/$$name.c}; done
    
    clean:
            rm -f $(DRV_DIR)/*.drv
    

    编译的效果是将所有的小程序都编译一遍,不管有没有出错,不管是否为最新。我需要的效果是编译所有程序,编译到哪一个出错即停止,编译前还要检查目标文件和源文件的更新时间,因此这个makefile不好用,只是学习了一下makefile的循环和自定义函数。

    然后又构思makefile该如何写,就在思考的过程中想起来了学裸机程序时工程有一个.S和一个.c文件的编译,再结合makefile的伪目标,结构就很清晰了,这里用一个变量ALL_NAME表示获取到的所有src目录下的.c文件的名字替换为.drv(去除src/目录名和.c后缀,再补上drv/和.drv后缀,形式为drv/xxx.drv),代码忘了拷,贴部分自己能记住的吧:

    .PHONY:default clean
    
    default:$(ALL_NAME)
    
    $(DRV_DIR)/%.drv:$(SRC_DIR)/%.c
        $(CC) $(CFLAGS) -o $@ $< $(LDFLAGS)
    
    clean:
        rm $(DRV_DIR)/*.drv -r
    

    这个makefile就能满足之前的要求了。通过两个makefile的编写,学习了makefile的函数、自定义函数、循环、伪目标、makefile规则与shell规则的混合问题。

    展开全文
  • 今天博主在将VS2015工程转换位...当时没仔细分析原因,今天又同时遇到结构出现这问题,最后也从头文件中放在源文件中,至于有没有更好的办法,目前,博主不确定。望大神指教! 博主头文件有加条件编译的 #

    今天博主在将VS2015工程转换位为Qt工程遇到,调试到最后,出现multiple definition of `xxxx`问题,之前有遇到这问题。

    做法是,把.h文件中定义的变量放到.cpp中,然后就解决了。

    当时没仔细分析原因,今天又同时遇到结构出现这问题,最后也从头文件中放在源文件中,至于有没有更好的办法,目前,博主还不确定。望大神指教!


    博主头文件有加条件编译的

    #ifndef _TEST_H_
    #define _TEST_H_
    。。。
    #endif

       重复定义的问题,没有出在这,继续分析:(下面附一博主分析,最后附有链接,该博主分析的是.c ,本人是.cpp,完全一个道理了)

        要解决这个问题先来看看变量的定义和声明的区别。
       
        声明是向编译器介绍名字--标识符,它告诉编译器“这个函数或变量在某处可找到,它的模样象什么”。而定义是说:“在这里建立变量”或“在这里建立函数”。它为名字分配存储空间。无论定义的是函数还是变量,编译器都要为它们在定义点分配存储空间。对于变量,编译器确定变量的大小,然后在内存中开辟空间来保存其数据,对于函数,编译器会生成代码,这些代码最终也要占用一定的内存。总之就是:把建立空间的声明成为“定义”,把不需要建立存储空间的成为“声明”。
        查看代码,确实我在一个.h文件中定义了一个变量,而这个.h文件被多个文件包含,单独编译都没有问题,但是到链接的时候就出现问题了。

    #ifndef _TEST_H_
    #define _TEST_H_

    ......

    struct pdesc const cameractrl_params[] = {
    {PT_STRI_, 0,  1, OFFSET(cameractrl, homecmd), "homecmd", 32, 0, NULL, NULL},
        {PT_STRI_, 0,  1, OFFSET(cameractrl, zoomctrl), "zoomctrl", 32, 0, NULL, NULL},
        {PT_STRI_, 0,  1, OFFSET(cameractrl, focusctrl), "focusctrl", 32, 0, NULL, NULL},
        {PT_STRI_, 0,  1, OFFSET(cameractrl, aperturectrl), "aperturectrl", 32, 0, NULL, NULL},
        {PT_NULL_, 0,  0, 0, "", 0, 0, NULL, NULL} /* PT_NULL means tail of struct pdesc array */
    };

    ......

    #endif

       一般在.h文件中定义一个变量声明时,在其他文件中只要包含了这个.h文件,编译的时候就会独立被编译器解释,然后每个.C文件会生成独立的标识符和符号表,所以上述代码在单独编译的时候并不会报错,语法是合法的。但是,最后在编译器链接的时候,就会将工程中所有的符号整合在一起,由于文件中有重复的变量,于是就会出现重复定义的错误,系统就是提示你“multiple definition of `xxx`”。
      进一步解释,我们可以这样想象编译每一个C源文件时,相当于一条有管道包围的纵向水流,二者互不干扰。当链接时两条原本相互独立的水管横向流了,所有就出现了重复的元素。所以当进行链接时就会出现重复定义的标示符。重复定义的标示符在这里只是变量,函数不会。因为函数确实只在.c中定义了一次,多次声明是没有问题的,而变量确实出现了两次定义。两次重复的变量定义链接器就不知道该已那个地址作为变量的内存,所以报错。
     
      怎么解决这个问题呢?

      其实只需要将全局变量定义从.h文件中挪到.c文件里,然后在.h文件中用extern做外部声明即可。即在.c文件中声明变量,然后在头文件.h所有的变量声明前加上extern,注意在.h文件中就不要对变量进行初始化赋值了。然后其他需要使用全局变量的.c文件中包含.h文件即可。编译器会为.c生成目标文件,然后链接时,如果该.c文件使用了全局变量,链接器就会链接到此.c文件。其他文件需要使用此全局变量也是同样的方式,目的其实只有一个,就是使变量在内存中唯一化。
     
     例子,上面代码如此修改就对了:

    在test.c中定义
    //test.c
    ......

    struct pdesc const cameractrl_params[] = {
    {PT_STRI_, 0,  1, OFFSET(cameractrl, homecmd), "homecmd", 32, 0, NULL, NULL},
        {PT_STRI_, 0,  1, OFFSET(cameractrl, zoomctrl), "zoomctrl", 32, 0, NULL, NULL},
        {PT_STRI_, 0,  1, OFFSET(cameractrl, focusctrl), "focusctrl", 32, 0, NULL, NULL},
        {PT_STRI_, 0,  1, OFFSET(cameractrl, aperturectrl), "aperturectrl", 32, 0, NULL, NULL},
        {PT_NULL_, 0,  0, 0, "", 0, 0, NULL, NULL} /* PT_NULL means tail of struct pdesc array */
    };

    ......

    在test.h中定义

    //test.h
    #ifndef _TEST_H_
    #define _TEST_H_

    ......

    extern struct pdesc const cameractrl_params[];

    ......

    #endif


      这样,multiple definition of `xxxx`就搞明白了。


    done

    附:http://blog.csdn.net/mantis_1984/article/details/53571758

    展开全文
  • ④ zhparser运行环境配制:运行测试sql语句,发现并没有实现分词,想起来应该是词典位置不正确,到zhparser源码中去搜寻,发现如下代码,看来是放到tsearch_data目录下面,用同样的方法找到ini文件的目录,将它们都...
  • Note: 该解决方案会加载两个项目,一个EasyPR,用于编译src/下的源文件生成静态库libeasypr.lib;另一个Demo,用来编译test/下的main.cpp,并链接libeasypr.lib生成可执行程序。 配置OpenCV库 OpenCV for ...
  • 你必须知道的495个C语言问题

    千次下载 热门讨论 2015-05-08 11:09:25
    5.7 我的编译器提供的头文件中定义的NULL为0L。为什么? 5.8 NULL可以合法地用作函数指针吗? 5.9 如果NULL和0作为空指针常量等价的,那我到底该用哪一个呢? 5.10但是如果NULL的值改变了,比如在使用非零...
  • 1.9 如何生成“半全局变量”,就是那种只能被部分源文件中的部分函数访问的变量? 34 存储类型 35 1.10 同一个静态(static)函数或变量的所有声明都必须包含static存储类型吗? 35 1.11 extern在函数声明中什么...
  • 1.9 如何生成“半全局变量”,就是那种只能被部分源文件中的部分函数访问的变量? 34 存储类型 35 1.10 同一个静态(static)函数或变量的所有声明都必须包含static存储类型吗? 35 1.11 extern在函数声明中什么...
  •  5.7 我的编译器提供的头文件中定义的NULL为0L。为什么? 5.8 NULL可以合法地用作函数指针吗? 5.9 如果NULL和0作为空指针常量等价的,那我到底该用哪一个呢? 5.10但是如果NULL的值改变了,比如在使用非零...
  • 5.7 我的编译器提供的头文件中定义的NULL为0L。为什么?  5.8 NULL可以合法地用作函数指针吗?  5.9 如果NULL和0作为空指针常量等价的,那我到底该用哪一个呢?  5.10但是如果NULL的值改变了,比如在使用非...
  • 5.7 我的编译器提供的头文件中定义的NULL为0L。为什么? 57 5.8 NULL可以合法地用作函数指针吗? 57 5.9 如果NULL和0作为空指针常量等价的,那我到底该用哪一个呢? 58 5.10 但是如果NULL的值改变了,比如在...
  • 《你必须知道的495个C语言问题》

    热门讨论 2010-03-20 16:41:18
    1.9 如何生成“半全局变量”,就是那种只能被部分源文件中的部分函数访问的变量? 5 存储类型 6 1.10 同一个静态(static)函数或变量的所有声明都必须包含static存储类型吗? 6 1.11 extern在函数声明中什么...
  • Qt Creator 编译的程序,在其工程文件夹下会有一个debug 文件夹,其中有程序的.exe 可执行文件。但Qt Creator 默认用动态链接的, 就是可执行程序在运行时需要相应的.dll 文件。我们点击生成的.exe 文件,首 先...
  • o 7.1 我在一个源文件中定义了 char a[6], 在另一个中声明了 extern char *a 。为什么不行 ? o 7.2 可是我听说 char a[ ] 和 char *a 一样的。 o 7.3 那么, 在 C 语言中 ``指针和数组等价" 到底什么意思 ? ...
  • Platform SDK资料将会清楚地说明该函数返回NULL INVALID_HANDLE_VALID,以便指明函数运行已经失败。 PVOID 如果函数运行失败,则返回值NULL,否则返回PVOID,以 标识数据块的内存地址。 LONG/DWORD 这...
  •  应该指出的,在C语言中,所有的函数定义,包括主函数main在内,都平行的。也就是说,在一个函数的函数体内, 不能再定义另一个函数, 即不能嵌套定义。但是函数之间允许相互调用,也允许嵌套调用。习惯上把...
  • moderngpu:moderngpu用于GPUs通用计算的生产力库,它只有为CUDA编写的C++头文件。该库的独特价值在于其用于解决不规则并行问题的加速基元。 NCCL:用于集体多GPU通信的优化基元。 OpenCL :并行编程的异构系统...
  • 1.9 如何生成“半全局变量”,就是那种只能被部分源文件中的部分函数访问的变量? 存储类型 1.10 同一个静态(static)函数或变量的所有声明都必须包含static存储类型吗? 1.11 extern在函数声明中什么意思? 1.12 ...
  • 1.9 如何生成“半全局变量”,就是那种只能被部分源文件中的部分函数访问的变量? 存储类型 1.10 同一个静态(static)函数或变量的所有声明都必须包含static存储类型吗? 1.11 extern在函数声明中什么意思? 1.12 ...
  • 你必须知道的495个C语言问题(PDF)

    热门讨论 2009-09-15 10:25:47
    g 不能编译。. . . . . . . 5 1.12 这样的初始化有什么问题?char *p = malloc(10); 编译器提示“非 法初始式” 云云。. . . . . . . . . . . . . . . . . . . . . . . . . . . 5 1.13 以下的初始化有什么区别?char...
  • 代码语法错误分析工具pclint8.0

    热门讨论 2010-06-29 07:00:09
    编译这个文件,看下你的编译器给你多少警告,再运行下lint, 可以自己对比一下。 我的机器上,VC产生0 errors 0 warnings, 而lint程序产生了如下8条警告信息,有些还是很有用处的提示,这里就不一一分析了. test.cpp...
  • FXP:经Microsoft FoxPro编译源文件 G GDM:铃声、口哨声和声音板模块格式 GetRight:GetRight未完成的下载文件 GHO:Norton 克隆磁盘映像 GID:Windows 95全局索引文件(包括帮助状态) GIF:CompuServe...
  • C++网络爬虫项目

    2018-07-04 00:59:17
    以上所述仅仅网络爬虫的一般性原理,具体实现过程中可以有很多优化的 空间,比如将“网页下载”以多线索(进程或线程)并发的方式实现,甚至将 “DNS解析”也处理为并发的过程,以避免爬虫系统的I/O吞吐率受到...

空空如也

空空如也

1 2
收藏数 25
精华内容 10
关键字:

编译是放头文件还源文件