我一直在尝试安装一个名为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中共享,但这似乎不起作用。在过去,我也尝试在CMakeCache.txt的所有标志中添加-fPIC,但也没有用。
请告诉我您的理解和建议。 非常感谢您提前,
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
答案 0 :(得分:1)
我尝试在CMAKE_CXX_FLAGS中包含-fPIC,如下所示,和 同样在CMAKE_SHARED_LINKER_FLAGS中共享,但似乎没有 工作
不要这样做。在CMake中手动添加低级编译器标志几乎总是一个坏主意。
请求项目构建为动态库的一般方法是设置项目的BUILD_SHARED_LIBS
选项:
<xsl:value-of select="sum(current-group()[col3 = 'C']/col2) - sum(current-group()[col3 = 'D']/col2)"/>
如果这不能立即起作用,通常意味着该项目不打算构建为动态库,在这种情况下,没有简单的解决方案。
Dakota,例如,claims to support this option properly。
如果这不起作用,您可以尝试使用CMAKE_POSITION_INDEPENDENT_CODE
等选项,但成功的机会不会很高。在这种情况下,您应该联系图书馆维护人员以获取建议。