Joh*_*nna 5 c++ dynamic-linking static-libraries dlopen
这个问题与dlopen静态库linux C ++中的动态库密切相关,但存在进一步的复杂性(并使用C ++代替C):
我有一个链接到静态库(.a)的应用程序,该库使用dlopen函数加载动态库(.so)。另外,动态库调用在静态库中定义的函数。
有没有一种方法可以在不将动态库与静态库链接的情况下进行编译,反之亦然?
这是到目前为止我尝试过的内容,对相关问题的示例进行了一些修改:
app.cpp:
#include "staticlib.hpp"
#include <iostream>
int main()
{
std::cout << "and the magic number is: " << doSomethingDynamicish() << std::endl;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
staticlib.hpp:
#ifndef __STATICLIB_H__
#define __STATICLIB_H__
int doSomethingDynamicish();
int doSomethingBoring();
#endif
Run Code Online (Sandbox Code Playgroud)
staticlib.cpp:
#include "staticlib.hpp"
#include "dlfcn.h"
#include <iostream>
int doSomethingDynamicish()
{
void* handle = dlopen("./libdynlib.so",RTLD_NOW);
if(!handle)
{
std::cout << "could not dlopen: " << dlerror() << std::endl;
return 0;
}
typedef int(*dynamicfnc)();
dynamicfnc func = (dynamicfnc)dlsym(handle,"GetMeANumber");
const char* err = dlerror();
if(err)
{
std::cout << "could not dlsym: " <<err << std::endl;
return 0;
}
return func();
}
Run Code Online (Sandbox Code Playgroud)
staticlib2.cpp:
#include "staticlib.hpp"
#include "dlfcn.h"
#include <iostream>
int doSomethingBoring()
{
std::cout << "This function is so boring." << std::endl;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
dynlib.cpp:
#include "staticlib.hpp"
extern "C" int GetMeANumber()
{
doSomethingBoring();
return 1337;
}
Run Code Online (Sandbox Code Playgroud)
并建立:
g++ -c -o staticlib.o staticlib.cpp
g++ -c -o staticlib2.o staticlib2.cpp
ar rv libstaticlib.a staticlib.o staticlib2.o
ranlib libstaticlib.a
g++ -rdynamic -o app app.cpp libstaticlib.a -ldl
g++ -fPIC -shared -o libdynlib.so dynlib.cpp
Run Code Online (Sandbox Code Playgroud)
当我运行它./app,我得到
could not dlopen: ./libdynlib.so: undefined symbol: _Z17doSomethingBoringv
and the magic number is: 0
Run Code Online (Sandbox Code Playgroud)
如果可执行文件与标志“-rdynamic”(或同义词“--export-dynamic”)链接,则可执行文件中的全局符号也将用于解析动态加载库中的引用。
这意味着要使应用程序导出其符号以在动态库中使用,您必须将应用程序与-rdynamic标志链接。
除了上面描述的问题,还有一个与静态库有关的问题:问题在于,由于doSomethingBoring在主程序中未调用该函数,因此staticlib2.o未链接静态库中的目标文件。
答案可以在例如这个旧问题中找到,它告诉您添加--whole-archive链接器标志:
g++ -rdynamic -o app app.cpp -L. \
-Wl,--whole-archive -lstaticlib \
-Wl,--no-whole-archive -ldl
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
3761 次 |
| 最近记录: |