我一直在尝试安装一个名为 DAKOTA 的软件包,它使用了我已经在另一个程序中使用的 BOOST 和 Trilinos 库。对于编译和链接,我使用的是 cmake,但我无法通过 make 步骤。如果您能指出我的方向,那将非常有帮助。请在下面找到我用来编译和链接库的 cmake 命令脚本,以及它停止时的过程...... 据我了解如下。我正在使用用于构建其他程序的 Boost 和 Trilinos 库文件来构建项目 DAKOTA。但是在从 Teuchos_BLAS.cpp.o 创建库文件 liboptpp.so 时出现错误,因为它被 libteuchosnumerics.a 使用。我不确定我是否理解正确,但我从中得到的是我需要创建一个共享库并再次使用 -fPIC 重新编译 Teuchos_BLAS.cpp.o。 我尝试在 CMAKE_CXX_FLAGS 中包含 -fPIC,如下所示,并且也在 CMAKE_SHARED_LINKER_FLAGS 中包含 -shared 但这似乎不起作用。过去我也尝试在 CMakeCache.txt 的所有标志中添加 -fPIC 但也没有用。
请告诉我您的理解和建议。 非常感谢您,
创建命令
!/bin/庆典
cmake \
-D CMAKE_INSTALL_PREFIX=/home/pablo/BuildDakota/build \
-D MPI_BASE_DIR:PATH="/usr/lib/openmpi/" \
-D CMAKE_CXX_FLAGS:STRING="-O0 -std=c++11 -pedantic -ftrapv -Wall -fPIC -Wno-long-long" \
-D BOOST_ROOT:PATH=/home/pablo/BuildPeridigm/ \
-D Boost_NO_BOOST_CMAKE:BOOL=TRUE \
-D Boost_NO_SYSTEM_PATHS:BOOL=TRUE \
-D Trilinos_DIR:PATH=/home/pablo/BuildPeridigm/lib/cmake/Trilinos/ \
-D CMAKE_SHARED_LINKER_FLAGS:STRING="-shared" \
/home/pablo/BuildDakota/dakota-6.7.0.src
过程
[ 9%] Building C object packages/external/OPTPP/src/CMakeFiles/optpp.dir/PDS/sort.c.o
[ 9%] Building C object packages/external/OPTPP/src/CMakeFiles/optpp.dir/PDS/writes.c.o
[ 10%] Building CXX object packages/external/OPTPP/src/CMakeFiles/optpp.dir/Utils/BoolVector.C.o
[ 10%] Building C object packages/external/OPTPP/src/CMakeFiles/optpp.dir/Utils/file_cutils.c.o
[ 10%] Building CXX object packages/external/OPTPP/src/CMakeFiles/optpp.dir/Utils/ioformat.C.o
[ 10%] Building CXX object packages/external/OPTPP/src/CMakeFiles/optpp.dir/Utils/mcholesky.C.o
[ 10%] Building CXX object packages/external/OPTPP/src/CMakeFiles/optpp.dir/Utils/OptppExceptions.C.o
[ 10%] Building CXX object packages/external/OPTPP/src/CMakeFiles/optpp.dir/Utils/OptppFatalError.C.o
[ 10%] Building CXX object packages/external/OPTPP/src/CMakeFiles/optpp.dir/Utils/print.C.o
[ 10%] Building C object packages/external/OPTPP/src/CMakeFiles/optpp.dir/Utils/timers.c.o
[ 10%] Linking CXX shared library ../lib/liboptpp.so
/usr/bin/ld: /home/pablo/BuildPeridigm/lib/libteuchosnumerics.a(Teuchos_BLAS.cpp.o): relocation R_X86_64_32S against `_ZN7Teuchos11ETranspCharE' can not be used when making a shared object; recompile with -fPIC
/home/pablo/BuildPeridigm/lib/libteuchosnumerics.a: error adding symbols: Bad value
collect2: error: ld returned 1 exit status
packages/external/OPTPP/src/CMakeFiles/optpp.dir/build.make:2264: recipe for target 'packages/external/OPTPP/lib/liboptpp.so' failed
make[2]: *** [packages/external/OPTPP/lib/liboptpp.so] Error 1
CMakeFiles/Makefile2:1409: recipe for target 'packages/external/OPTPP/src/CMakeFiles/optpp.dir/all' failed
make[1]: *** [packages/external/OPTPP/src/CMakeFiles/optpp.dir/all] Error 2
Makefile:162: recipe for target 'all' failed
make: *** [all] Error 2
最佳答案
I tried including -fPIC in CMAKE_CXX_FLAGS as you may see below, and also -shared in CMAKE_SHARED_LINKER_FLAGS but this doesn't seem to work.
不要这样做。在 CMake 中手动添加低级编译器标志几乎总是一个坏主意。
请求将项目构建为动态库的一般方法是设置 BUILD_SHARED_LIBS
项目选项:
cmake -DBUILD_SHARED_LIBS=ON [...]
如果这不能立即奏效,通常意味着该项目不打算构建为动态库,在这种情况下没有简单的解决方案。
达科他州,例如,claims to support this option properly .
如果这不起作用,您可以尝试使用 CMAKE_POSITION_INDEPENDENT_CODE
等选项,但你成功的机会不会很高。在这种情况下,您可能应该联系库维护者寻求建议。
关于c++ - 使用 Cmake 安装时创建动态库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48371097/