编译C程序,同时在gcc中包含.h文件

时间:2018-03-10 19:21:39

标签: c gcc

我必须编写一个包含外部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.CconvertAll.hconvertAll.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]);

}

2 个答案:

答案 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

继续