如果我的库有外部依赖项,是否可以将这些库包含到我自己的静态库中,我的库的用户不需要链接到这些依赖项?或者我应该让它成为动态库?
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++
命令?
答案 0 :(得分:1)
是否可以使静态 C++ 库自包含?
请注意,大多数 C++ 标准(例如 n3337)甚至没有提到库(特别是与您的编译器相关的,例如 GCC 及其标准 C++ 库 libstdc++
)
但是您的 C++ 库可能会使用标准 C++ containers(C++ 标准的一部分)或其他开源 C++ 库,例如 Qt 或 FLTK,其许可可能要求您的用户能够升级它们。
请务必联系您的律师,因为您的问题可能涉及与软件许可相关的法律问题。
如果您的目标是 Linux,您希望利用现有共享库(如 ldd(1) 列出的,或者 - 如果您有一个正在运行的进程 - pmap(1)) .阅读 Drepper 的论文 How to write shared libraries 了解详细信息和解释,并考虑让您的图书馆成为共享图书馆。
<块引用>clang++ -c library.cpp
提示:至少使用 clang++ -c -Wall -Wextra -g library.cpp
,然后使用 GDB 调试您的库,并尝试使用 g++ -Wall -Wextra -g library.cpp
并同时使用 valgrind。
为了便于在 Linux 系统上安装(或测试)您的库,您可能需要为其提供 package。在 Debian 上,它将是一些 *.deb
文件。