C 未定义的引用…-联系问题?

C 未定义的引用…-联系问题?,c,gcc,linker,compiler-errors,undefined-reference,C,Gcc,Linker,Compiler Errors,Undefined Reference,我不知道我得到了以下错误: proc1.o: In function `procEx1': /cygdrive/c/armprojects/projekt/motor/proc1.c:45: undefined reference to `motorTest_test' collect2: ld returned 1 exit status make: *** [main.hex] Error 1 我已检查了有关此问题的以下线程: 这是我的输出: 13:46:46 **** Build

我不知道我得到了以下错误:

proc1.o: In function `procEx1':
/cygdrive/c/armprojects/projekt/motor/proc1.c:45: undefined reference to `motorTest_test'
collect2: ld returned 1 exit status
make: *** [main.hex] Error 1
我已检查了有关此问题的以下线程:

这是我的输出:

13:46:46 **** Build of configuration Default for project motor ****
make all 
make[1]: Entering directory `/cygdrive/c/armprojects/projekt/motor/startup'
rm -f .depend 
arm-elf-gcc -c -mcpu=arm7tdmi  -I . -DEL -DGCC   -mthumb-interwork -DLPC2148  -Os -    gdwarf-2 -Wall -Wcast-align -Wcast-qual -Wimplicit -Wnested-externs -Wpointer-arith -Wswitch     -Wreturn-type  -Wa,-ahlms=consol.lst -o consol.o consol.c
arm-elf-gcc -c -mcpu=arm7tdmi  -I . -DEL -DGCC   -mthumb-interwork -DLPC2148  -Os -    gdwarf-2 -Wall -Wcast-align -Wcast-qual -Wimplicit -Wnested-externs -Wpointer-arith -Wswitch -Wreturn-type  -Wa,-ahlms=framework.lst -o framework.o framework.c
framework.c: In function 'exceptionHandlerInit':
framework.c:201: warning: pointer targets in assignment differ in signedness
arm-elf-gcc -c -mcpu=arm7tdmi  -I . -DEL -DGCC   -mthumb-interwork -DLPC2148  -x           assembler-with-cpp -gstabs -Wa,-alhms=startup.lst -o startup.o startup.S
arm-elf-ar cr libea_startup_thumb.a consol.o framework.o startup.o
arm-elf-ranlib libea_startup_thumb.a
make[1]: Leaving directory `/cygdrive/c/armprojects/projekt/motor/startup'
make[1]: Entering directory `/cygdrive/c/armprojects/projekt/motor/LCD'
rm -f .depend 
arm-elf-gcc -c -mcpu=arm7tdmi  -I . -DEL -DGCC   -mthumb-interwork -DLPC2148  -O0 -    gdwarf-2 -Wall -Wcast-align -Wcast-qual -Wimplicit -Wnested-externs -Wpointer-arith -Wswitch     -Wreturn-type  -Wa,-ahlms=LCD.lst -o LCD.o LCD.c
arm-elf-ar cr lib_LCD.a LCD.o 
arm-elf-ranlib lib_LCD.a
make[1]: Leaving directory `/cygdrive/c/armprojects/projekt/motor/LCD'
make[1]: Entering directory `/cygdrive/c/armprojects/projekt/motor/interrupt'
rm -f .depend 
arm-elf-gcc -c -mcpu=arm7tdmi  -I . -DEL -DGCC   -mthumb-interwork -DLPC2148  -Os -    gdwarf-2 -Wall -Wcast-align -Wcast-qual -Wimplicit -Wnested-externs -Wpointer-arith -Wswitch     -Wreturn-type  -Wa,-ahlms=interrupt_timer.lst -o interrupt_timer.o interrupt_timer.c
arm-elf-gcc -c -mcpu=arm7tdmi  -I . -DEL -DGCC   -mthumb-interwork -DLPC2148  -Os -    gdwarf-2 -Wall -Wcast-align -Wcast-qual -Wimplicit -Wnested-externs -Wpointer-arith -Wswitch     -Wreturn-type  -Wa,-ahlms=interrupt_tacho.lst -o interrupt_tacho.o interrupt_tacho.c
arm-elf-ar cr lib_interrupt.a interrupt_timer.o interrupt_tacho.o 
arm-elf-ranlib lib_interrupt.a
make[1]: Leaving directory `/cygdrive/c/armprojects/projekt/motor/interrupt'
rm -f .depend 
arm-elf-gcc -c -mcpu=arm7tdmi -mthumb-interwork -I./startup -DEL -DGCC -mthumb-interwork     -mthumb -DTHUMB_CSTART -DTHUMB_INTERWORK -mthumb-interwork -DLPC2148  -O0 -gdwarf-2 -Wall -    Wcast-align -Wcast-qual -Wimplicit -Wnested-externs -Wpointer-arith -Wswitch -Wreturn-type      -Wa,-ahlms=main.lst -o main.o main.c
arm-elf-gcc -c -mcpu=arm7tdmi -mthumb-interwork -I./startup -DEL -DGCC -mthumb-interwork     -mthumb -DTHUMB_CSTART -DTHUMB_INTERWORK -mthumb-interwork -DLPC2148  -O0 -gdwarf-2 -Wall -    Wcast-align -Wcast-qual -Wimplicit -Wnested-externs -Wpointer-arith -Wswitch -Wreturn-type      -Wa,-ahlms=proc1.lst -o proc1.o proc1.c
motor/motor_test.h:18: warning: 'duty1' defined but not used
motor/motor_test.h:19: warning: 'duty2' defined but not used
arm-elf-gcc -c -mcpu=arm7tdmi -mthumb-interwork -I./startup -DEL -DGCC -mthumb-interwork     -mthumb -DTHUMB_CSTART -DTHUMB_INTERWORK -mthumb-interwork -DLPC2148  -O0 -gdwarf-2 -Wall -    Wcast-align -Wcast-qual -Wimplicit -Wnested-externs -Wpointer-arith -Wswitch -Wreturn-type      -Wa,-ahlms=proc2.lst -o proc2.o proc2.c
arm-elf-gcc -c -mcpu=arm7tdmi -mthumb-interwork -I./startup -DEL -DGCC -mthumb-interwork     -mthumb -DTHUMB_CSTART -DTHUMB_INTERWORK -mthumb-interwork -DLPC2148  -O0 -gdwarf-2 -Wall -    Wcast-align -Wcast-qual -Wimplicit -Wnested-externs -Wpointer-arith -Wswitch -Wreturn-type      -Wa,-ahlms=proc3.lst -o proc3.o proc3.c
arm-elf-gcc main.o proc1.o proc2.o proc3.o  startup/libea_startup_thumb.a     pre_emptive_os/pre_emptive_os.a LCD/lib_LCD.a interrupt/lib_interrupt.a -I./startup -    mcpu=arm7tdmi -mthumb-interwork -mthumb-interwork -nostartfiles -T     build_files/link_32k_512k_rom.ld -o main.elf -Wl,-Map=main.map,--cref
proc1.o: In function `procEx1':
/cygdrive/c/armprojects/projekt/motor/proc1.c:45: undefined reference to     `motorTest_test'
collect2: ld returned 1 exit status
make: *** [main.hex] Error 1

13:46:52 Build Finished (took 6s.46ms)
如果您愿意,可以在以下位置签出我的存储库:

以下是我的一些代码(相关部分):
程序1.c

/*
 * proc1.c
 *
 *  Created on: 31 okt 2011
 *      Author: Tommy
 */

/*****************************************************************************
 * Process 1
 ****************************************************************************/
#include "pre_emptive_os/api/osapi.h"
#include "general.h"
#include "startup/lpc2xxx.h"
#include "startup/printf_P.h"
#include "startup/ea_init.h"
#include "startup/consol.h"
#include "startup/config.h"
#include "startup/framework.h"
#include "utils/utils.h"
#include "LCD/LCD.h"
#include "motor/motor_test.h"

extern long const delayshort;
extern long const delaylong;

extern tCntSem mutexLCD;

/*****************************************************************************
 * Function prototypes
 ****************************************************************************/
void LCD_clearDisplay(void);

/****************************************************************************/

void
procEx1(void* arg)
{
  tU8 error;

    for (;;) {  // QUESTION: why use for-loop?

        osSemTake(&mutexLCD, 0, &error);

        // REMARK: doesn't work at the moment... issues including runPwm()
        motorTest_test();

        osSemGive(&mutexLCD, &error);

        osSleep(100);
    }

}

void LCD_clearDisplay(void) {
    delay(delayshort);
    send_instruction(1);    //clears the display
    delay(delaylong);
    send_instruction(2);    //the cursor is moved to the first position
}
电机试验

/******************************************************************************
 * Includes
 *****************************************************************************/
#include "motor.h"

/******************************************************************************
 * Defines
 *****************************************************************************/
#define TASK                9       // task 1 - use circulary loop
                                    // task 2 - use constant PWM signal
                                    // ...
#define RUN_SETPWM_IN_LOOP  1       // dictates whether setPwmDutyPercentx(tU32) should be run outside the "TASK conditional statement"

/*****************************************************************************
 * Global variables
 ****************************************************************************/
static tU32 duty1;
static tU32 duty2;


/******************************************************************************
 * Prototypes
 *****************************************************************************/
void motorTest_test();
void dev_run(tU32 duty1, tU32 duty2);
void pwm_motor_init();
void pwm_motor_run(tU32 duty1, tU32 duty2);
void change_mode(short mode);
电动机试验

#include "motor_test.h"

/******************************************************************************
 * Functions
 *****************************************************************************/
void motorTest_test() {
    init();
    dev_run(duty1, duty2);
}



// dev function - not used in release
// COMMENT: PWM signal is continuously generated when the setPwmDutyPercent(tU32) function is called, no need to endlessly iterate the calls
// EDIT:    seems like you need to iterate over the setPwmDutyPercent(tU32) functions afterall...
// COMMENT: the duty sets the speed of the motor driver
//          the value that can be set is 0-10000
//          a higher value means a lower speed, conversely a low value means a higher speed
void dev_run(tU32 duty1, tU32 duty2) {
    //wait 10 ms
    //delayMs(10);

    //wait 100 ms
    //delayMs(100);

    // COMMENT: try running without delays
    //          seems to work fine..

    while (1) {

        //set frequency value
        if (RUN_SETPWM_IN_LOOP == 1) {
            setPwmDutyPercent1(duty1);
            setPwmDutyPercent2(duty2);
        }

        //  delayMs(10);

        switch (TASK) {
        case 1: {
            //update duty cycle (0.00 - 100.00%, in steps of 0.10%)
            duty1 += 10;
            if (duty1 > 10000)
                duty1 = 0;
            break;
        }
        case 2: {
            duty1 = 0;
            duty2 = 8500;
            // COMMENT: slowest speed = 8500 duty
            //          fastest speed = 0    duty
            break;
        }
        case 3: { // left
            duty1 = 6000;
            duty2 = 8000;
            break;
        }
        case 4: { // right
            duty1 = 8000;
            duty2 = 6000;
            break;
        }
        case 5: {
            duty1 = 6000;
            duty2 = 6000;
            break;
        }

        case 6: {
            short delay = 1;
            short duty_vals = 6000;
            short section[3] = { 1, 0, 0 };

            if (section[0] == 1) {
                setMode1(MODE_FORWARD);
                setMode2(MODE_FORWARD);
                duty1 = duty_vals;
                duty2 = duty_vals;
                setPwmDutyPercent1(duty1);
                setPwmDutyPercent2(duty2);
                //delayMs(0);
                delay_millis(delay);
            }

            if (section[1] == 1) {
                setMode1(MODE_BRAKE);
                setMode2(MODE_BRAKE);
                setPwmDutyPercent1(duty1);
                setPwmDutyPercent2(duty2);
                delay_millis(delay);
            }

            if (section[2] == 1) {
                setMode1(MODE_REVERSE);
                setMode2(MODE_REVERSE);
                duty1 = duty_vals;
                duty2 = duty_vals;
                setPwmDutyPercent1(duty1);
                setPwmDutyPercent2(duty2);
                delay_millis(delay);
            }
            break;
        }
        case 7: {
            pwm_motor_init();
            duty1 = 6000;
            duty2 = 6000;

            //delayMs(10);
            delay_millis(10);

            pwm_motor_run(duty1, duty2);
            break;
        }
        case 8: {


            setMode1(MODE_FORWARD);
            setMode2(MODE_FORWARD);

            delay_millis(700);

            duty1 = 7000;
            duty2 = 7000;


            setMode1(MODE_REVERSE);
            setMode2(MODE_REVERSE);

            delay_millis(700);

            duty1 = 1000;
            duty2 = 1000;

            break;
        }

        case 9: {
            duty1 = 0;
            duty2 = 0;
            break;
        }

        }
    }
}

/*****************************************************************************
 * Temporary developer functions
 ****************************************************************************/
void pwm_motor_init() {
    setMode1(MODE_FORWARD);
    setMode2(MODE_FORWARD);

    delay_millis(10);
}

void pwm_motor_run(tU32 duty1, tU32 duty2) {
    setPwmDutyPercent1(duty1);
    setPwmDutyPercent2(duty2);

    while(1) {
        change_mode(MODE_FORWARD);
        change_mode(MODE_BRAKE);
        change_mode(MODE_REVERSE);
        change_mode(MODE_BRAKE);
    }
}

void change_mode(short mode) {
    setMode1(mode);
    setMode2(mode);
    delay_millis(10);
}

确保将所有C源包括在的
CSRCS
变量中。然后构建系统将知道它也必须编译该文件,并将生成的对象包含到链接中。

您不想将文件motor\u test.c包含到共享对象中吗?没有
motorTest\u test()
在该存储库的源代码中的任意位置定义。我没有在命令行中看到用于链接的
motor\u test.o
。如果没有链接,这就解释了问题…@SeanBright回购协议不是最新的,我将很快提交更改…@AntonKovalenko我在哪里添加它?(我不太熟悉makefile…)我现在遇到了更多更奇怪的编译错误。。让我问你一个一般性的问题(在这个特定的背景下)。如果我这样做:
#在这里列出C源文件。

(天哪!我该如何断线…)
CSRCS=main.C proc1.C proc2.C proc3.C motor/motor.C
它能正确地将motor.C编译成对象吗?@Ryuji,不能在这里测试,因为我这里没有arm gcc。但是从
build\u files/general.mk
forms
OBJS?=$(CSRCS.c=.o)$(ASRCS.S=.o)
我想应该是这样的,至少如果一切都按预期进行的话。顺便说一句,有。我试过设置
CSRCS=main.c proc1.c proc2.c proc3.c motor/motor.c
,也正如DevSolar
CSRCS:=$(通配符*.c)
所建议的那样,但这会产生一组新的问题(即使我恢复到旧设置..奇怪)。太糟糕了,你不能在注释中添加换行符。@Ryuji,你可以
make motor/motor.o
看看这一步是否有效。您可能还应该将
motor/motor_test.c
添加到
CSRCS
中。并指出您现在遇到的错误。虽然有一个新问题可能更适合这些问题。我已经手动添加了所有C源代码,但我在外部生成文件中是这样做的:
CSRCS=interrupt/interrupt\u tach.C interrupt/interrupt\u timer.C LCD/LCD.C motor/motor\u test.C utils/utils.C main.C proc1.C proc2.C proc3.C
。这似乎是可行的(尽管应该有更好、更自动化的方法来解决这个问题)