首页 > 解决方案 > 是否可以使静态 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

解决方案


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

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

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

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

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

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


推荐阅读