是否可以使静态C++库自包含



如果我的库有外部依赖项,是否可以将这些库包括到我自己的静态库中,这样我的库的用户就不需要链接到这些依赖项了?还是应该让它成为动态库?

library.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

library.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;
}

main.c

#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文件。

最新更新