我想制作一个静态库供其他程序使用,但不知道为什么失败

asz*_*waz 0 c c++

这是该文件的源代码:

\n

文件选择器.h:

\n
#ifndef FILE_SELECTOR\n#define FILE_SELECTOR\n\nconst char *open_file_dialog();\n\nconst char *save_file_dialog();\n\n#endif\n
Run Code Online (Sandbox Code Playgroud)\n

linux/文件选择器.cpp:

\n
#include <cstring>\n#include "../fileselector.h"\n#include <iostream>\n\nconst char *open_file_dialog() {\n    ...\n}\n\nconst char *save_file_dialog() {\n    ...\n}\n
Run Code Online (Sandbox Code Playgroud)\n

这是我的静态库制作步骤:

\n
$ gcc linux/fileselector.cpp fileselector.h -c\n$ ar rs libfileselector.a fileselector.o\n
Run Code Online (Sandbox Code Playgroud)\n

这是使用静态库的测试:

\n

主程序

\n
#include "fileselector.h"\n\nint main() {\n    open_file_dialog();\n    return 0;\n}\n
Run Code Online (Sandbox Code Playgroud)\n
$ gcc main.c -L. -lfileselector -o main\n/usr/bin/ld: /tmp/ccOTrMR8.o: in function `main\':\nmain.c:(.text+0xa): undefined reference to `open_file_dialog\'\ncollect2: error\xef\xbc\x9ald return 1\n
Run Code Online (Sandbox Code Playgroud)\n

哪里有问题?

\n

dbu*_*ush 7

您定义了一组 C++ 函数,但正在从 C 程序中使用它们。

C++ 中的函数名称在编译阶段会被破坏,以允许存在多个具有相同名称但不同签名的函数。C 程序不进行名称修改,因此库函数的编译名称与 C 程序期望的普通函数名称不匹配。

如果您希望 C 程序可以使用 C++ 函数,则需要通过extern "C"在定义和声明周围添加来禁用名称修饰。

所以你的 C++ 源文件将如下所示:

extern "C" {

const char *open_file_dialog() {
    ...
}

const char *save_file_dialog() {
    ...
}

}
Run Code Online (Sandbox Code Playgroud)

你的标题看起来像这样:

#ifdef __cplusplus
extern "C" {
#endif

const char *open_file_dialog();

const char *save_file_dialog();

#ifdef __cplusplus
}
#endif
Run Code Online (Sandbox Code Playgroud)

#ifdef标头中的 是必需的,因为它是extern "C"仅限 C++ 的功能。

另外,编译时不需要列出头文件。因为它包含在源文件中,所以它已经被编译。