c++ - 是否可以使静态 C++ 库自包含?
问题描述
如果我的库具有外部依赖项,是否可以将这些库包含到我自己的静态库中,我的库的用户不需要链接到这些依赖项?或者我应该让它成为动态库?
图书馆.h
#ifndef AMAZING_CPP_LIBRARY_H
#define AMAZING_CPP_LIBRARY_H
#ifdef __cplusplus
extern "C" {
#endif
typedef struct {
int m_code;
} Result;
extern void message(const char* msg);
extern Result * get_result();
extern void vector_example(int size);
#ifdef __cplusplus
}
#endif
#endif //AMAZING_CPP_LIBRARY_H
图书馆.cpp
#include <iostream>
#include <vector>
#include "library.h"
void vector_example(int size){
std::vector<uint8_t> vec;
vec.reserve(size);
for (int i = 0; i < size; ++i) {
vec.push_back(i);
}
// do something with vector
}
void message(const char* msg) {
std::cout << msg<< "\n";
}
Result * get_result() {
Result* result = new Result();
result->m_code = 200;
return result;
}
主程序
#include "library.h"
int main() {
vector_example(2);
message("hello from cpp");
return 0;
}
我正在运行的命令
1$ clang++ -c library.cpp
2$ ar -rcs libamazing_cpp.a library.o
3$ clang -c main.c
4$ clang main.o libamazing_cpp.a
是否可以仅通过链接到我的静态库而无需使用-lstdc++
或使用clang++
命令进行编译?
解决方案
是否可以使静态 C++ 库自包含?
这是特定于实现的,有时可能是非法的。
请注意,大多数 C++ 标准(例如n3337)甚至都没有提及库(特别是与您的编译器相关的,例如GCC及其标准 C++ 库libstdc++
)
但是您的 C++ 库可能会使用标准 C++容器(C++ 标准的一部分)或其他开源 C++ 库,例如Qt或FLTK,其许可证可能要求您的用户能够升级它们。
请务必联系您的律师,因为您的问题可能涉及与软件许可相关的法律问题。
在 Linux 上,这将是低效的
如果您以 Linux 为目标,您希望利用现有的共享库(由ldd(1)列出,或者 - 如果您有一个正在运行的进程 - 由pmap(1)列出)。阅读 Drepper 的论文如何编写共享库以获取详细信息和解释,并考虑将您的库设为共享库。
clang++ -c library.cpp
提示:至少clang++ -c -Wall -Wextra -g library.cpp
使用GDB来调试你的库,并尝试同时g++ -Wall -Wextra -g library.cpp
使用valgrind。
为了简化您的库在 Linux 系统上的安装(或测试),您可能需要为其提供一个包。在Debian上,它将是一些*.deb
文件。
推荐阅读
- sequelize.js - 为受约束的关联起别名
- mysql - 什么是 SCHEMA_MIGIMP..MIGRATION_STATUS?
- c# - 我想将值编号添加到文本框的第一个元素
- sapui5 - 如何在 XML 视图中传递 sap.m.P13nItem 的值
- symfony - 更新学说的数组结果
- perl - arg 1 的类型必须是块或子 {}(不是子程序条目)
- java - 来自 EclipseLink 的 ScrollableCursor 抛出 SQLException:结果集已关闭。在远程环境上
- mysql - MySQL Select Query 运行速度很慢
- android - 从快捷方式启动应用程序时如何显示启动画面
- javascript - 如何从嵌套的 JSON 数据中获取值