CMake在Linux下编译失败

CMake failed to compile in Linux

本文关键字:编译 失败 Linux CMake      更新时间:2023-10-16

我正在修改一个在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} )

谢谢…

链接器告诉您哪里出了问题:该对象在共享库中使用,但没有使用-fPIC编译。你需要添加这个标志。

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

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

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

  • 构建lib_foo1 lib_foo2的共享版本(.so)。除静态外(a)
  • 使用-fPIC参数构建静态库
  • 不要将静态库链接到共享库,而是将它们链接到应用程序。如果共享库中使用了静态库中的函数,则可能不可能这样做。