调用 C 头文件时出现链接错误
Linking error when Calling a C header file
我正在从用 Cpp 编写的 Qt 编写的头文件中调用 C 函数。当我尝试编译我的 Qt 应用程序时,我总是收到链接错误。
这是头文件:
#ifndef GROUND_SERVER_H
#define GROUND_SERVER_H
#ifdef __cplusplus
extern "C" {
#endif
struct system_info{
char id[33];
};
/* Support function for the below function */
void Generate_Key(char*,char*,char*);
/* Runs the actual key generation as well as
moves the file to the respectful card or
USB drive inserted in the system that will
act as the user system key */
void run_key_generation(struct system_info*,char*,char*);
/* Function to run the server on a selected
port at which the medium that the server
is to listen on will be connected. */
void run_server(unsigned short);
void generate_id();
#ifdef __cplusplus
};
#endif
#endif
#include "foo.h"
只是将 foo.h
的内容文本包含到当前编译单元中。如果您在不同的文件中实现一个函数,那么您也需要编译该文件,并且 link 生成的目标文件形成可执行文件(或库)。
这在混合 C 和 C++(或大多数其他编译的)代码时也适用:您使用适合其编写语言的编译器编译源代码文件,最后 link 将所有内容组合在一起.
所以:
foo.h
#ifndef FOO_H
#define FOO_H 1
#ifdef __cplusplus
extern "C" {
#endif
int answer(void);
#ifdef __cplusplus
}
#endif
#endif
foo.c
int answer(void) {
return 42;
}
bar.cc
#include <iostream>
#include "foo.h"
int main(int argc, char ** argv) {
std::cout << "The answer is " << answer() << std::endl;
return 0;
}
要从这些文件创建可执行文件,您需要:
gcc -c foo.c # Compile C file
g++ -c bar.cc # Compile C++ file
g++ -o foobar foo.o bar.o # Link
我正在从用 Cpp 编写的 Qt 编写的头文件中调用 C 函数。当我尝试编译我的 Qt 应用程序时,我总是收到链接错误。
这是头文件:
#ifndef GROUND_SERVER_H
#define GROUND_SERVER_H
#ifdef __cplusplus
extern "C" {
#endif
struct system_info{
char id[33];
};
/* Support function for the below function */
void Generate_Key(char*,char*,char*);
/* Runs the actual key generation as well as
moves the file to the respectful card or
USB drive inserted in the system that will
act as the user system key */
void run_key_generation(struct system_info*,char*,char*);
/* Function to run the server on a selected
port at which the medium that the server
is to listen on will be connected. */
void run_server(unsigned short);
void generate_id();
#ifdef __cplusplus
};
#endif
#endif
#include "foo.h"
只是将 foo.h
的内容文本包含到当前编译单元中。如果您在不同的文件中实现一个函数,那么您也需要编译该文件,并且 link 生成的目标文件形成可执行文件(或库)。
这在混合 C 和 C++(或大多数其他编译的)代码时也适用:您使用适合其编写语言的编译器编译源代码文件,最后 link 将所有内容组合在一起.
所以:
foo.h
#ifndef FOO_H
#define FOO_H 1
#ifdef __cplusplus
extern "C" {
#endif
int answer(void);
#ifdef __cplusplus
}
#endif
#endif
foo.c
int answer(void) {
return 42;
}
bar.cc
#include <iostream>
#include "foo.h"
int main(int argc, char ** argv) {
std::cout << "The answer is " << answer() << std::endl;
return 0;
}
要从这些文件创建可执行文件,您需要:
gcc -c foo.c # Compile C file
g++ -c bar.cc # Compile C++ file
g++ -o foobar foo.o bar.o # Link