我正在尝试将项目中的头文件导入到另一个项目中的.c文件中。我们的想法是拥有一个标题和函数的通用项目,可以在同一个解决方案中由多个项目使用。
这些是头文件,它们是自己项目中的.c文件:
Util_library.h:
#pragma once
#include <string.h>
void reverse(char *c);
LIBRARY.C:
#include "Util_Library.h"
void reverse(char *c) { //reverse function to be called by main functions
size_t len = strlen(c) - 1, i, k = len - 1; //purpose of function is to
char tmp; //reverse a given string
for (i = 0; i < len / 2; i++) {
tmp = c[k];
c[k] = c[i];
c[i] = tmp;
k--;
}
}
这是主要功能(在另一个单独的项目中[但在同一解决方案中] ),其中 #include 包含头文件 Util_Library.h < / em>,它可以使用函数 reverse():
#include <stdio.h>
#include <stdlib.h> //malloc library
#include "C:\Users\...\Library\Util_Library.h" //not real path
void main() {
char ch[100];
printf("Enter a string of characters:");
fgets(ch, sizeof(ch), stdin);
printf("%s", ch);
reverse(ch);
printf("%s", ch);
int chk = getchar();
}
即使我没有语法错误(根据编译器),当我尝试运行程序时,我得到这两个错误:
错误LNK2019未解析的外部符号“void __cdecl reverse(char *)”(?reverse @@ YAXPEAD @ Z)在函数main Assignment 1D C:\ Users ... \ Assignment_1D \ Assignment_1D.obj 1
中引用错误LNK1120 1未解析的外部分配1D C:\ Users \ mmusc \ Dropbox \ Development \ C(++) - Visual Studio \ Assignments \ x64 \ Debug \ Assignment 1D.exe 1
感谢您的帮助!
编辑我已经包含了包含函数reverse()的实际.c文件,但是无论如何只导入一个头文件而不是整个.c文件甚至可能包含函数你在特定的主要功能编辑
中不需要答案 0 :(得分:2)
不仅要包含头文件:还必须在项目中包含.c文件。
您收到链接器错误,因为在将每个调用与函数本身链接时,该函数不存在,因为您尚未编译相应的.c文件。
转到项目选项并在项目中包含该.c文件。重新编译,您将运行您的程序。
希望这有帮助。
顺便说一下,这不是Visual Studio特有的,它将在您应用此策略的任何IDE中发生。答案 1 :(得分:1)
包含标头使reverse
的声明可用,但不是实现。
不幸的是,C ++构建模型非常陈旧,here is a decent introduction
您可以将.c文件添加到项目中
或者,您可以将reverse
.c / .h文件(与其他文件一起)编译到静态库,并将静态库添加到主项目中。不幸的是,库之间的一些编译选项必须匹配(例如,它如何链接到C ++运行时)。此外,您可能希望构建单独的调试和发布库。更不幸的是,这些库在编译器之间不可移植,通常甚至不能在同一编译器的不同版本之间移植