我必须编写一个包含外部C文件的程序。我最初在Visual Studio中编写了这个程序,但我现在必须在Linux上切换到gcc
。我包含了允许我在另一个C文件中调用函数的.h
文件。这适用于Visual Studio,但gcc不接受该引用。尝试调用函数convertAllStrings(c,size)
时会中断。
错误是:undefined reference to `convertAllStrings'
我在Google上搜索过,发现一些有这个问题的人说我应该使用gcc -I
命令。我试过这个,但没有运气。具体来说,我用过:
gcc -I/home/CS/user/unix Main.c -o proj
我在同一目录中有Main.C
,convertAll.h
和convertAll.c
。这是我的代码:
File Main.c:
#include <stdio.h>
#include <math.h>
#include <time.h>
#include <sys/types.h>
#include <string.h>
#include <stdlib.h>
#include "convertAll.h"
int main(int ac, char *av[])
{
int size;
char strings[100];
char temp;
printf("Number of Strings: ");
scanf("%d", &size);
char **c = malloc(size);
int i = 0;
int j = 0;
while (i < size)
{
printf("Enter string %i ",(i+1));
scanf("%c", &temp); // temp statement to clear buffer
fgets(strings, 100, stdin);
c[i] = malloc(strlen(strings) + 1);
strcpy(c[i], strings);
i++;
}
convertAllStrings(c,size); // ** CODE BREAKS HERE
return 0;
}
文件convertAll.h:
#ifndef convertAll_H_
#define convertAll_H_
void convertAllStrings(char **sentenceList, int numOfSentences);
#endif
文件convertAll.c:
void convertAllStrings(char **sentenceList, int numOfSentences){
printf("function pass 0 is: %s\n", sentenceList[0]);
}
答案 0 :(得分:5)
您使用过:
gcc -I/home/CS/user/unix Main.c -o proj
您只是在这里编译Main.c ..你还没有编译convertAll.c。
你需要:
gcc -I/home/CS/user/unix Main.c convertAll.c -o proj
或者您可以使用以下其中一种:
gcc -I. Main.c convertAll.c -o proj
gcc Main.c convertAll.c -o proj
(顺便说一句,对于gcc -Wall -Wextra -g
的所有警告和调试信息,您最好ask the compiler
答案 1 :(得分:2)
这不起作用:
string transposition(string input)
{
string encryptedOutput = ""; int flag = 0;
for(int i=0; i<input.length(); i++)
{
string temp = "";
if(!isalpha(input[i]))
{
temp = input.substr(flag, i);
flag = i+1;
for(int j=0; j<temp.length(); j++)
{
encryptedOutput += temp[temp.length() - j - 1];
}
encryptedOutput += input[i];
}
}
return encryptedOutput;
}
尝试编译并将gcc -I/home/CS/user/unix Main.c -o proj
链接到main.c
I.E它甚至不使用convertAll.c文件。
建议如下内容:
proj
Visual Studio为您完成了这项工作,因为您在项目中包含了这些文件。
你可以编写一个gcc -c -Wall -Wextra -Wconversion -pedantic -std=gnu11 Main.c -o Main.o -I.
gcc -c -Wall -Wextra -Wconversion -pedantic -std-gnu11 convertAll.c -o convertAll.o -I.
gcc Main.o convertAll.o -o proj
来做所有这些,然后用
Makefile
然后用
执行你的程序make
以下是适合您项目的Makefile。
./proj
注意:缩进行必须由SHELL := /bin/sh
NAME := proj
#
# macro of all *.c files
# (NOTE:
# (the following 'wildcard' will pick up ALL .c files
# (like FileHeader.c and FunctionHeader.c
# (which should not be part of the build
# (so be sure no unwanted .c files in directory
# (or change the extension
#
SRC := $(wildcard *.c)
OBJ := $(SRC:.c=.o)
DEP := $(SRC:.c=.d)
INC := $(SRC:.c=.h) # or perhaps INC := convertAll.h
MAKE := /usr/bin/make
CC := /usr/bin/gcc
CP := cp
LDFLAGS :=
DEBUG := -ggdb3
CFLAGS := $(DEBUG) -Wall -Wextra -pedantic -Wconversion -std=gnu11
LIBS :=
.PHONY: all
all : $(NAME)
#
# link the .o files into the executable
# using the linker flags
# -- explicit rule
#
$(name): $(OBJ)
#
# ======= $(name) Link Start =========
$(CC) $(LDFLAGS) -o $@ $(OBJ) $(COMMON_OBJ) $(LIBS)
# ======= $(name) Link Done ==========
#
#
#create dependancy files -- inference rule
#
%.d: %.c
#
# ========= START $< TO $@ =========
$(CC) -M $(CPPFLAGS) $< > $@.$$$$; \
sed 's,\($*\)\.o[ :]*,\1.o $@ : ,g' < $@.$$$$ > $@; \
rm -f $@.$$$$
# ========= END $< TO $@ =========
#
# compile the .c files into .o files using the compiler flags
# -- inference rule
#
%.o: %.c %.d
#
# ========= START $< TO $@ =========
$(CC) $(CFLAGS) -c $< -o $@ -I.
# ========= END $< TO $@ =========
#
.PHONY: clean
clean:
# ========== CLEANING UP ==========
rm -f *.o
rm -f $(name).map
rm -f $(name)
rm -f *.d
# ========== DONE ==========
# include the contents of all the .d files
# note: the .d files contain:
# <filename>.o:<filename>.c plus all the dependancies for that .c file
# I.E. the #include'd header files
# wrap with ifneg... so will not rebuild *.d files when goal is 'clean'
#
ifneq "$(MAKECMDGOALS)" "clean"
-include $(DEP)
endif
char