CMake在Linux下编译失败
CMake failed to compile in Linux
我正在修改一个在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参数构建静态库
- 不要将静态库链接到共享库,而是将它们链接到应用程序。如果共享库中使用了静态库中的函数,则可能不可能这样做。
相关文章:
- 包含模板文件的递归会导致编译失败
- 提升 1.64 单元测试编译失败
- C++模板的模板编译失败
- 使用已删除的函数进行编译失败,并显示 uclibc
- MinGW-w64 编译失败,nullptr_t
- 使用提升线程时编译失败
- 编译花絮 g++, clang++, 使用 libboost -- g++8 编译失败时 g++7 成功;
- CMake + Qt,moc 编译失败,无法实现 QMetaObject 方法(编译器找不到基本 ui 对象的标头?
- 带有引用的std::tuple在clang中编译失败,但在gcc中编译失败
- 解决由于在哈希函数中使用了不完整的类型而导致的编译失败
- 将XCode升级到verison 11.1后,C++编译失败
- 添加类型名会导致程序编译失败
- 将 qi::lexeme 添加到灵气中的规则时编译失败
- 如果我在下面的代码中使用 list 而不是 vector,为什么在我尝试在迭代器之间执行减法的行中编译失败?
- 返回 std::stringstream - 编译失败
- 编译失败:strlen 不是 std 的成员
- MSBuidel - 将资源文件添加到项目后静态库编译失败
- C++ - 在 std::thread 中调用重载函数时编译失败
- QtWebEngine 到嵌入式 Linux 交叉编译失败
- 使用 glibc 2.7 包含路径编译失败