相关疑难解决方法(0)

如何强制gcc链接未使用的静态库

我有一个程序和一个静态库:

// main.cpp
int main() {}

// mylib.cpp
#include <iostream>
struct S {
    S() { std::cout << "Hello World\n";}
};
S s;
Run Code Online (Sandbox Code Playgroud)

我想将静态库(libmylib.a)链接到程序对象(main.o),虽然后者不直接使用前者的任何符号.

以下命令似乎不适合g++ 4.7.它们将在没有任何错误或警告的情况下运行,但显然libmylib.a不会链接:

g++ -o program main.o -Wl,--no-as-needed /path/to/libmylib.a
Run Code Online (Sandbox Code Playgroud)

要么

g++ -o program main.o -L/path/to/ -Wl,--no-as-needed -lmylib
Run Code Online (Sandbox Code Playgroud)

你有更好的想法吗?

c c++ gcc g++ ld

34
推荐指数
3
解决办法
2万
查看次数

如何在共享对象中包含存档的所有对象?

当编译我们的项目,我们创建几个档案(静态库),说liby.alibz.a每个包含定义函数的对象文件y_function()z_function().然后,这些存档被连接在一个共享对象中,比如说libyz.so,这是我们的主要可分发目标之一.

g++  -fPIC  -c -o y.o y.cpp
ar cr liby.a y.o
g++  -fPIC  -c -o z.o z.cpp
ar cr libz.a z.o
g++ -shared -L. -ly -lz -o libyz.so
Run Code Online (Sandbox Code Playgroud)

当使用该共享对象到示例程序,比方说x.c,链接失败,因为到功能的未定义的引用y_function()z_function().

g++ x.o -L. -lyz -o xyz
Run Code Online (Sandbox Code Playgroud)

但是,当我将最终可执行文件直接与归档(静态库)链接时,它可以工作.

g++ x.o -L. -ly -lz -o xyz
Run Code Online (Sandbox Code Playgroud)

我的猜测是,归档中包含的目标文件没有链接到共享库中,因为它们中没有使用它们.如何强制包容?

编辑:

可以使用--whole-archive ld选项强制包含.但如果导致编译错误:

g++ -shared '-Wl,--whole-archive' -L. -ly -lz -o libyz.so
/usr/lib/libc_nonshared.a(elf-init.oS): In function `__libc_csu_init':
(.text+0x1d): undefined …
Run Code Online (Sandbox Code Playgroud)

linux linker gcc archive

15
推荐指数
1
解决办法
1万
查看次数

标签 统计

gcc ×2

archive ×1

c ×1

c++ ×1

g++ ×1

ld ×1

linker ×1

linux ×1