当前位置: 首页 > 知识库问答 >
问题:

Linux上的共享库与-fpic错误

麹鸿煊
2023-03-14

我试图在Linux中使用Cmake创建的Makefile编译一个共享库,但运行make时出现以下错误:

   Linking CXX shared library libcpp-lib.so
   /usr/bin/ld: /home/davide/Desktop/boost_1_55_0/stage/lib/libboost_system.a(error_code.o): relocation R_X86_64_32 against .rodata.str1.1 can  not be used when making a shared object; recompile with -fPIC
   /home/davide/Desktop/boost_1_55_0/stage/lib/libboost_system.a: could not read symbols:   Bad value
   collect2: ld returned 1 exit status
   make[2]: *** [libcpp-lib.so] Error 1
   make[1]: *** [CMakeFiles/cpp-lib.dir/all] Error 2
   make: *** [all] Error 2

为了避免上面显示的-fpic错误,我还需要指定什么?

提前多谢

共有1个答案

谢志文
2023-03-14

boost库需要使用-fpic编译:请看:如何从boost.python中使用-fpic编译静态库

尝试在项目中添加cmake by编译器标志:

set (CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fPIC")
set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fPIC")
 类似资料:
  • 问题内容: 我正在尝试使用通过Cmake创建的Makefile在Linux中编译共享库,但是运行make会出现以下错误: 我在CMakeLists.txt中提供以下命令,以便说我想要共享(.so)库: 为了避免上面显示的-fPIC错误,我还需要指定什么? 提前谢谢 问题答案: 需要使用-fPIC编译boost库:请看一下:如何使用boost.python中的-fPIC编译静态库。 尝试在项目中按c

  • 问题内容: 这是使用g ++ 进行动态共享库编译的后续版本。 我正在尝试在Linux上的C++中创建一个共享的类库。当我尝试使用库中定义的类时,我的问题开始了。我链接到的第二篇教程展示了如何加载用于创建库中定义的类的对象的符号,但是没有_使用_ 这些对象来完成任何工作。 有谁知道用于创建共享C ++类库的更完整的教程,该教程还显示了如何在单独的可执行文件中 使用 这些类?一个非常简单的教程,显示了

  • 问题内容: 我正在尝试建立一个共享库。让我们说libabc.so。它使用另一个.so文件,例如lib123.so(/ usr / local / lib中的一个lib)。现在我在我的应用程序中使用共享的liblibabc.so。说我的应用程序。我想知道我应该如何链接这些二进制文件?我不想直接将我的应用程序与lib123.so链接。my- app应该仅与libabc.so链接。我怎样才能做到这一点?

  • 问题内容: 最近,我们被要求提供其中一个库的Linux版本,之前我们是在Linux下开发的,并已针对Windows发行,而在Windows上部署库通常要容易得多。我们遇到的问题是将导出的符号剥离为仅暴露界面中的符号。想要这样做的三个很好的理由 为了保护我们技术的专有方面,以免通过导出的符号被暴露。 防止用户遇到符号名称冲突的问题。 为了加快库的加载速度(至少有人告诉我)。 然后举一个简单的例子:

  • 问题内容: 两个共享库liba.so和libb.so。liba.so使用libb.so。所有c文件都使用-fPIC编译。链接使用- shared。当我们在liba.so上调用dlopen时,它无法在libb.so中找到符号…我们得到“未定义符号”错误。我们可以dlopen libb.so没有错误。我们知道liba正在找到libb,因为我们没有得到文件未找到错误。删除libb.so时,出现文件未找到

  • 问题内容: 我正在Linux下使用C ++开发共享库,并且我希望该库使用log4cxx进行日志记录。但是,我不确定该如何设置。为了使log4cxx正常工作,我需要创建一个记录器对象。我如何确保在加载库时创建了该对象? 我怀疑将记录器对象创建为全局变量,然后从我的库的任何源文件中使用它,在标头中将其声明为extern,将是最容易的。但是,一旦应用程序连接到库,如何自动创建记录器? 我知道在Windo