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
formsOBJS?=$(CSRCS.c=.o)$(ASRCS.S=.o)
我想应该是这样的,至少如果一切都按预期进行的话。顺便说一句,有。我试过设置CSRCS=main.c proc1.c proc2.c proc3.c motor/motor.c
,也正如DevSolarCSRCS:=$(通配符*.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
。这似乎是可行的(尽管应该有更好、更自动化的方法来解决这个问题)