c++ - 我想做一个静态库供其他程序使用,但不知道为什么失败
问题描述
这是文件的源代码:
文件选择器.h:
#ifndef FILE_SELECTOR
#define FILE_SELECTOR
const char *open_file_dialog();
const char *save_file_dialog();
#endif
linux/文件选择器.cpp:
#include <cstring>
#include "../fileselector.h"
#include <iostream>
const char *open_file_dialog() {
...
}
const char *save_file_dialog() {
...
}
这是我的静态库制作步骤:
$ gcc linux/fileselector.cpp fileselector.h -c
$ ar rs libfileselector.a fileselector.o
这是使用静态库的测试:
主程序
#include "fileselector.h"
int main() {
open_file_dialog();
return 0;
}
$ gcc main.c -L. -lfileselector -o main
/usr/bin/ld: /tmp/ccOTrMR8.o: in function `main':
main.c:(.text+0xa): undefined reference to `open_file_dialog'
collect2: error:ld return 1
问题出在哪里?
解决方案
您定义了一组 C++ 函数,但在 C 程序中使用它们。
C++ 中的函数名称在编译阶段被修改,以允许存在多个具有相同名称但不同签名的函数。C 程序不进行名称修改,因此库函数的编译名称与 C 程序期望的纯函数名称不匹配。
如果您希望 C 程序可以使用 C++ 函数,则需要通过添加extern "C"
定义和声明来禁用名称修饰。
所以你的 C++ 源文件看起来像这样:
extern "C" {
const char *open_file_dialog() {
...
}
const char *save_file_dialog() {
...
}
}
你的标题看起来像这样:
#ifdef __cplusplus
extern "C" {
#endif
const char *open_file_dialog();
const char *save_file_dialog();
#ifdef __cplusplus
}
#endif
标头中的#ifdef
's 是必需的,因为extern "C"
它是 C++ 独有的功能。
另外,编译时不需要列出头文件。因为它包含在源文件中,所以它已经被编译了。
推荐阅读
- python - MongoDB - 身份验证失败
- java - 反编译apk(java)后接口内的静态块
- ionic-framework - ionic cap sync 和 npx cap sync 有什么区别?
- python - 每次我的未读电子邮件数量发生变化时,有没有办法执行特定功能?
- javascript - 如何使用 Angular JS 链接到另一个页面
- xgboost - 部分依赖/ALE/ICE 在 r 中绘制 XgBoost
- javascript - 使用 Jira API 创建附件的 Google App 脚本
- vba - 具有用户登录和权限的数据库,无法正常工作
- java - Discord Bot 不响应我们的命令
- html - 如何使宽度超过 100% 的表格居中?