0

我正在更改在 Windows 上工作的 CMake 文件以在 Linux 中创建共享对象。

CMake 文件生成一个 makefile,当我在 Linux 上“make”时,它构建了 foo 库的对象,并显示了所有四个库的链接。例如:

链接 CXX 静态库 lib_foo_d.a

和最终的共享对象

链接 CXX 静态库 lib_scen_files_d.a

但最后它显示

/usr/bin/ld: lib_foo3/lib_foo3_d.a(chap_alt_scence_defs.cpp.o):
重定位 R_X86_64_32 反对 `.rodata' 制作共享对象时不能使用;
使用 -fPIC
lib_foo3/lib_foo3_d.a 重新编译:无法读取符号:错误值
collect2:ld 返回 1 退出状态

我尝试了其他一些选择,但没有任何乐趣。下面是我的 CMakeLists.txt。任何帮助/批评都会对我有益。

CMAKE_MINIMUM_REQUIRED( VERSION 2.8 )
CMAKE_POLICY( SET CMP0017 NEW ) 

PROJECT( disk_space_model )
INCLUDE( ../libs/helper_functions.cmake )
INCLUDE_THIRD_PARTY_SFC()
find_path_for_libs()

add_s_library( lib_foo1 )
add_s_library( lib_foo2) 
add_s_library( lib_foo3) 
add_s_library( lib_foo4) 

SET(    HEADER_FILES 
        stdafx.h
        INS_sensor_model.h
)

SET(    SOURCE_FILES
        Disk_space_model.cpp
)

SET(    RESOURCE_FILES 
        "Disk Space DLL.rc"
        resource.h
)

COMMON_SETUP()
set( LIB_FILES 
        lib_foo
        lib_foo1
        lib_foo3 
        lib_foo4 )

set(CMAKE_SHARED_LINKER_FLAGS "-Wl,--export-all-symbols")
ADD_LIBRARY( disk_space_model SHARED ${SOURCE_FILES} ${HEADER_FILES} ${RESOURCE_FILES}  ${CMAKE_HELPER_FILES} )
SET_OUTPUT_DIRS( disk_space_model )
TARGET_LINK_LIBRARIES( disk_space_model ${LIB_FILES} )

谢谢 ...

4

2 回答 2

1

链接器告诉您出了什么问题:该对象在共享库中使用,但未使用-fPIC. 您需要以某种方式添加此标志。

使用 CMake 2.8.9 或更高版本时,您可以简单地POSITION_INDEPENDENT_CODE在相关目标(静态库)上设置属性。

在 CMake 的早期版本中,您需要将标志直接添加到目标的COMPILE_FLAGS属性中(在编译器的正确拼写中,可能只是-fPIC)。

于 2013-03-07T15:31:32.160 回答
0

为了在 Linux 上构建共享库,所有链接到它的目标文件的源都必须编译为可重定位的(链接器抱怨的 -fPIC 选项)。您尝试将静态库 lib_foo1 lib_foo2 lib_foo3 等链接到您的共享库中,但它失败了。所以可能的解决方案:

  • 构建每个库 lib_foo1 lib_foo2 .. 的共享版本 (.so) 以及静态版本 (.a)
  • 使用 -fPIC 参数构建静态库
  • 不要将静态库链接到共享库,而是将它们链接到应用程序。如果在您的共享库中使用来自静态库的函数,这可能是不可能的。
于 2013-03-07T15:29:08.093 回答