gpt4 book ai didi

C++ 仅链接静态库的所需部分

转载 作者:太空狗 更新时间:2023-10-29 21:06:03 26 4
gpt4 key购买 nike

我正在尝试将静态库的某些部分链接到在 Linux 下使用 g++ 以 C++ 编写的程序。

我的库.h

#ifdef USE_EXTERN_LIB
# include <extern_lib.h>
void do_something (struct extern_lib);
#endif

void do_other (int);

我的库.c

#include "my_lib.h"

#ifdef USE_EXTERN_LIB
void do_something (struct extern_lib l)
{
// do something
}
#endif

void do_other (int a)
{
// do something
}

我正在使用 -DUSE_EXTERN_LIB 预处理器标志静态创建 libmy_lib.a 以将所有内容包含在其中。

但我想做的是创建两个程序:一个将此库与 *extern_lib* 一起使用,另一个在不使用 *extern_lib* 的情况下使用它,即:

g++ -L/path/to/lib -lmy_lib -o prog_wihtout_lib prog_without_lib.cc 
g++ -DUSE_EXTERN_LIB -L/path/to/lib -lmy_lib -o prog_with_lib prog_with_lib.cc

第二个程序编译但不是第一个,它说 extern_lib 未声明。

使用动态库,没有问题,因为符号是在运行时加载的,但我想要一个静态库。有没有办法只链接静态库的所需模块

编辑

prog_without_lib.cc

#include "my_lib.h"

int main ()
{
do_other (42);

return 0;
}

prog_with_lib.cc

#include "my_lib.h"

int main ()
{
do_other (42);

struct extern_lib l;
do_something (l);

return 0;
}

谢谢。

最佳答案

只需在库中链接,让链接器担心删除未使用的代码。这是它的工作。

您尝试做的事情没有意义(不,它在动态库中也没有意义。)定义仅在您编译库时有效,并且您在第一行执行此操作。在第二行,您只需将已编译的库链接到您的可执行文件中。但实际上,静态库的全部意义在于它们对链接器可见,因此它可以(除其他事项外)删除任何未使用的代码。那么,为什么您需要 USE_EXTERN_LIB 定义呢?

关于C++ 仅链接静态库的所需部分,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8398468/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com