如何将两个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) 背景:
我想将一些静态库链接到共享库中。原因是我希望我的应用程序使用我已经测试过的特定库版本。我不想将静态版本作为共享库与我的应用程序一起提供。我创建了这个示例库和应用程序以尽可能简化。我想在链接期间继续将共享库链接到应用程序。
问题:
为什么我会收到下面列出的错误消息?我究竟做错了什么?也许这不是 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)