【问题标题】:How to fix: 'can not be used when making a shared object; recompile with -fPIC' using Cmake. Using plain g++ works如何解决:'制作共享对象时不能使用;使用 Cmake 重新编译 -fPIC'。使用普通的 g++ 有效
【发布时间】:2019-09-11 08:22:01
【问题描述】:

我收到一条消息'在制作共享对象时无法使用;用 -fPIC' 重新编译

我尝试了其他示例,问题是一样的。

我试过了

  • 从 MODULE 更改为 SHARED
  • cmake .. -DCMAKE_CXX_FLAGS=-fPIC
  • 和其他变体

这行得通:

c++ -c -fPIC -I/usr/include/python3.6m ../account.cpp

c++ -shared -Wall -Werror -Wl,--export-dynamic account.o -L/usr/local/lib -lboost_python36 -o account.so

这是基本的 cmake

cmake_minimum_required(VERSION 3.10 FATAL_ERROR)

project(Test)

find_package(PythonInterp REQUIRED)

find_package(PythonLibs ${PYTHON_VERSION_MAJOR}.${PYTHON_VERSION_MINOR} EXACT REQUIRED)

find_package(Boost 1.70.0 COMPONENTS python REQUIRED)

add_library(account SHARED account.cpp)

target_link_libraries(account Boost::python)

target_include_directories(account PRIVATE ${PYTHON_INCLUDE_DIRS})

set_target_properties(account PROPERTIES PREFIX "")

使用:make VERBOSE=1,输出命令为:

c++  -DBOOST_ALL_NO_LIB -Daccount_EXPORTS -I/usr/include/python3.6m -isystem /usr/local/include  -fPIC   -o CMakeFiles/account.dir/account.cpp.o -c /src/boost_python_example/account.cpp

c++ -fPIC   -shared -Wl,-soname,account.so -o account.so CMakeFiles/account.dir/account.cpp.o /usr/local/lib/libboost_python36.a

所以 cmake 没有得到相同的路径和标志,我正在学习 cmake,所以我试图理解这个问题。显然问题不在于实际的库,而是告诉 cmake 在哪里可以找到合适的库。

【问题讨论】:

  • 从头开始,尝试进行详细构建 (make VERBOSE=1) 以查看实际使用哪些命令(和选项/标志)来构建库。 CMake 是否在做它应该做的事情?
  • 请在问题帖子中添加准确的错误消息,并附上准确的文件名。在当前形式中,错误描述非常模糊。

标签: c++ cmake boost-python


【解决方案1】:

解决方案非常简单。比较两个命令,cmake 命令缺少的是:--export-dynamic

所以我使用 option(BUILD_SHARED_LIBS "构建库作为共享而不是静态" ON)解决了足够有趣的评论是需要的。

工作解决方案:

cmake_minimum_required(VERSION 3.10 FATAL_ERROR)
project(Test)
option(BUILD_SHARED_LIBS "Build libraries as shared as opposed to static" ON)
find_package(PythonInterp REQUIRED)
find_package(PythonLibs ${PYTHON_VERSION_MAJOR}.${PYTHON_VERSION_MINOR} EXACT REQUIRED)
find_package(Boost 1.70.0 COMPONENTS python REQUIRED)
add_library(account SHARED account.cpp)
target_link_libraries(account Boost::python)
target_include_directories(account PRIVATE ${PYTHON_INCLUDE_DIRS})
set_target_properties(account PROPERTIES PREFIX "")

感谢大家为我提供解决方案的 cmets

【讨论】:

    猜你喜欢
    • 2017-05-22
    • 2018-03-31
    • 1970-01-01
    • 2016-06-06
    • 2017-07-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多