未定义的引用使用 automake

Posted

技术标签:

【中文标题】未定义的引用使用 automake【英文标题】:Undefined reference use automake 【发布时间】:2015-03-26 02:54:21 【问题描述】:

我的项目结构是这样的

-myProject
    -Makefile.am
    -configure.ac
    -src
        -Makefile.am
        -add.c
        -add.h
    -tests
        -Makefile.am
        -tests.c

Makefile.am

SUBDIRS = src tests
ACLOCAL_AMFLAGS = -I m4

src/Makefile.am

AM_CFLAGS = -Wall -lcunit -nostartfiles 
bin_PROGRAMS = addNum
addNum_SOURCES = add.c
addNum_CFLAGS = $(AM_CFLAGS)

src/add.c

#include <stdio.h>
#include <stdlib.h>
#include "add.h"

int addNum(int a, int b)
    return a+b;

测试/Makefile.am

AM_CFLAGS = -Wall -lcunit

INCLUDES = -I$(top_srcdir)/src -I../src 

noinst_LTLIBRARIES = libsrc.la
libsrc_la_SOURCES = -I$(top_srcdir)/src
libsrc_la_CFLAGS = $(AM_CFLAGS)


bin_PROGRAMS = test
test_SOURCES = tests.c
test_CFLAGS = $(AM_CFLAGS)
test_LDADD = libsrc.la

测试/测试.c

#include <stdio.h>
#include <stdlib.h>
#include "add.h"

int main(void)
    printf("num:%d",addNum(1,1));
    return 0;

错误:

tests.c:6: undefined reference to 'addNum'

我尝试在 tests/tests.c 中包含 addNum 函数。 我错过了什么吗? 谢谢。

【问题讨论】:

你在哪里运行构建?在***目录中,或在tests 子目录中。我不确定tests/Makefile.am 中的代码在哪里说“确保在链接test 之前构建../lib/libsrc.la。我什至不确定src/Makefile.am 中的代码在哪里说“构建libsrc.la”。而且,一般来说,最好避免使用命令名称test,因为它也是一个内置的shell,因此测试您的测试程序(即测试test)可能容易出错。跨度> 我在顶层构建项目。 libsrc.la是我自己创建的。我不知道如何包含src源文件,所以我尝试使用libsrc.la链接test 如何在其他项目中链接源文件进行测试? 我没有在多目录项目中使用automake;我不确定你需要做什么——除了仔细阅读手册和/或找到一个可以说明你正在尝试做的事情的项目,你可以从中复制想法。 @JonathanLeffler 谢谢你为我回答。 ctheo 的回答很有帮助。 【参考方案1】:

排序版本答案是变化

libsrc_la_SOURCES = -I$(top_srcdir)/src

libsrc_la_SOURCES = -I$(top_srcdir)/src/add.c

意思是你需要定义libsrc.la库需要的源列表。

但我认为您最好按照长版答案的步骤进行操作。 我猜你尝试从src 目录中的源列表创建一个libsrc.la 二进制文件,然后将此二进制文件与一组测试链接。所以首先你需要在src 目录中创建库。

src/Makefile.am

AM_CFLAGS = -Wall -lcunit
noinst_LTLIBRARIES = libsrc.la
libsrc_la_SOURCES = add.c
libsrc_la_CFLAGS = $(AM_CFLAGS)

然后将您的测试与此库链接。

测试/Makefile.am

AM_CFLAGS = -Wall -lcunit
INCLUDES = -I$(top_srcdir)/src -I../src 
bin_PROGRAMS = test
test_SOURCES = tests.c
test_CFLAGS = $(AM_CFLAGS)
test_LDADD = ../src/libsrc.la

【讨论】:

以上是关于未定义的引用使用 automake的主要内容,如果未能解决你的问题,请参考以下文章

未捕获的引用错误:未定义回调

编译错误 未定义的引用 怎么回事

显示对已定义对象的未定义引用

无法设置未定义或null引用的属性“onclick”

本地创建的对象的 gcc 未定义引用

js运行错误 无法获取未定义或 null 引用的属性“pagecount”