相关疑难解决方法(0)

将两个GCC编译的.o对象文件合并到第三个.o文件中

如何将两个GCC编译的.o对象文件合并到第三个.o文件中?

$ gcc -c  a.c -o a.o
$ gcc -c  b.c -o b.o
$ ??? a.o b.o -o c.o
$ gcc c.o other.o -o executable
Run Code Online (Sandbox Code Playgroud)

如果您有权访问源文件,-combineGCC标志将在编译之前合并源文件:

$ gcc -c -combine a.c b.c -o c.o
Run Code Online (Sandbox Code Playgroud)

但是,这仅适用于源文件,并且GCC不接受.o文件作为此命令的输入.

通常,链接.o文件无法正常工作,因为您无法使用链接器的输出作为输入.结果是共享库,并且不会静态链接到生成的可执行文件中.

$ gcc -shared a.o b.o -o c.o
$ gcc c.o other.o -o executable
$ ./executable
./executable: error while loading shared libraries: c.o: cannot open shared object file: No such file or directory
$ file c.o
c.o: ELF 32-bit …
Run Code Online (Sandbox Code Playgroud)

compiler-construction linker gcc ld object-files

76
推荐指数
2
解决办法
5万
查看次数

将静态库链接到共享库?

背景:

我想将一些静态库链接到共享库中。原因是我希望我的应用程序使用我已经测试过的特定库版本。我不想将静态版本作为共享库与我的应用程序一起提供。我创建了这个示例库和应用程序以尽可能简化。我想在链接期间继续将共享库链接到应用程序。

问题:

为什么我会收到下面列出的错误消息?我究竟做错了什么?也许这不是 Linux 上通常的做法,但是可以这样做吗?这个提升有针对性吗?

- - 图书馆

//example.cpp
#include <boost/thread.hpp>
void doit()
{
    boost::thread t1;
}

#build script
g++ -Wall -fPIC -I/usr/include -c example.cpp -o example.o
g++ -shared /usr/lib/libboost_thread.a /usr/lib/libboost_system.a 
    example.o -o libexample.so
#build OK. 
Run Code Online (Sandbox Code Playgroud)

---- 申请样本

//main.cpp
#include <iostream>
void doit();
int main()
{
    std::cout << "main\n";
    doit();
    return 0;
};

#build script.
g++ -Wall -c main.cpp -o main.o
g++ libexample.so main.o -o main

#error message.
libexample.so: undefined reference to `boost::thread::thread()'
libexample.so: undefined reference to `boost::thread::~thread()'
collect2: …
Run Code Online (Sandbox Code Playgroud)

c++ linux static shared g++

6
推荐指数
1
解决办法
5120
查看次数

标签 统计

c++ ×1

compiler-construction ×1

g++ ×1

gcc ×1

ld ×1

linker ×1

linux ×1

object-files ×1

shared ×1

static ×1