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

时间:2021-01-11 10:49:37

标签: c++ 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++ 命令?

1 个答案:

答案 0 :(得分:1)

<块引用>

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

这是特定于实现的,有时可能是非法的。

请注意,大多数 C++ 标准(例如 n3337)甚至没有提到库(特别是与您的编译器相关的,例如 GCC 及其标准 C++ 库 libstdc++

但是您的 C++ 库可能会使用标准 C++ containers(C++ 标准的一部分)或其他开源 C++ 库,例如 QtFLTK,其许可可能要求您的用户能够升级它们。

请务必联系您的律师,因为您的问题可能涉及与软件许可相关的法律问题。

在 Linux 上,它会效率低下

如果您的目标是 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 文件。