c++ - 使用 Cmake 安装时创建动态库

标签 c++ cmake

我一直在尝试安装一个名为 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/

相关文章:

C++ ⎼ 两个相似的函数,但表现却大不相同

c++ - SPOJ KFSTB - 帮助总司令 : Wrong Answer

c++ - 如何安全删除 QT::QTcpSocket?

c++ - CMake:将不同的 OpenCV 库链接到同一项目的不同可执行文件

c++ - std::remove_if 使用其他类方法

c++ - 在 qt C++ 中硬编码俄语翻译

c++ - Visual Studio 2010 - 自定义生成工具

CMake:将相对路径转换为绝对路径,构建目录为当前目录

cmake - 如何在cmake中的宏中定义函数

python - 如何在 mac os x (10.9) 上的 python 中安装 libgpuarray 和 clBLAS?