c - 未定义的引用使用automake

标签 c makefile automake

我的项目结构是这样的

-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函数。 我错过了什么吗? 谢谢。

最佳答案

排序版本答案要改变

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

关于c - 未定义的引用使用automake,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29270300/

相关文章:

c++ - 修改 CUDA 和 cpp Makefile

c++ - 如何更改我的 makefile 以构建到单独的文件夹中

c++ - 使用 GNU AutoTools 设置和使用数据目录路径

bash - Makefile 使用 Shell 创建变量

c++ - 在开源社区构建 C/C++ 程序的最佳方式是什么?

autotools - Automake会忽略缺少的NEWS/AUTHORS/COPYING/etc。标准文件

c++ - 为什么 printf 函数族关心语言环境?

c - 我如何用 C 练习 Unix 编程?

c - 初始化指向字符串 : garbled text? 的指针

c - 返回后浮点变量重置为 0.00