Chr*_*isW 6 gcc cmake static-libraries gfortran static-linking
[无耻地从CMake帮助列表中交叉发布]
我正试图尽可能静态地创建二进制文件.我得到的fortran代码有X11和quadmath作为依赖项,我遇到了很多问题(可能每个问题都应该是一个不同的问题?):
我的变量目前是
set(CMAKE_LIBRARY_PATH /usr/X11/lib /usr/X11/include/X11 ${CMAKE_LIBRARY_PATH})
find_package(X11 REQUIRED)
find_library(X11 NAMES X11.a PATHS /usr/X11/include/X11/ /usr/X11/lib)
find_library(X11_Xaw_LIB NAMES Xaw Xaw /usr/X11/include/X11/ /usr/X11/lib ${X11_LIB_SEARCH_PATH})
find_library(Xaw Xaw7 PATHS ${X11_LIB_SEARCH_PATH})
set(CMAKE_LIBRARY_PATH /usr/lib/gcc/x86_64-linux-gnu/4.7 /usr/lib/gcc/x86_64-linux-gnu/4.7/x32 /usr/lib/gcc/x86_64-linux-gnu/4.7/32 ${CMAKE_LIBRARY_PATH})
find_library(quadmath NAMES quadmath.a)
set(BUILD_SHARED_LIBS ON)
set(CMAKE_FIND_LIBRARY_SUFFIXES .a ${CMAKE_FIND_LIBRARY_SUFFIXES})
set(LINK_SEARCH_START_STATIC TRUE)
set(LINK_SEARCH_END_STATIC TRUE)
set(SHARED_LIBS OFF)
set(STATIC_LIBS ON)
set(CMAKE_INSTALL_RPATH_USE_LINK_PATH TRUE)
set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -static")
Run Code Online (Sandbox Code Playgroud)使用这些,CMake尝试静态地构建每个程序(如预期的那样) - 然而,它失败了因为我没有Xaw.a- 我无法确定这是否真的应该存在.我已经安装了libxaw7-dev我期望修复它的最新版本.一种选择是自己编译X11库,但我真的不想这样做......
如果我只set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -static")注释掉,那么CMake会编译所有内容,但是每个程序都使用共享库,即使我.a在find_library()调用中指定了X11库的位置.我期待CMake在可能的地方使用.a文件然后只使用共享库 - 有没有办法强制这种行为?
有没有人知道这里描述的错误修复:http://gcc.gnu.org/bugzilla/show_bug.cgi?id = 46539 ; 因此gfortran似乎无法静态链接libquadmath?我尝试使用gcc修复但我无法让CMake识别libgfortran标志:
cmake -DCMAKE_Fortran_COMPILER=gcc -DCMAKE_Fortran_FLAGS=-gfortran
Run Code Online (Sandbox Code Playgroud)结果是
-- The Fortran compiler identification is unknown
-- Check for working Fortran compiler: /usr/bin/gcc
-- Check for working Fortran compiler: /usr/bin/gcc -- broken
CMake Error at /usr/share/cmake-2.8/Modules/CMakeTestFortranCompiler.cmake:54 (message):
The Fortran compiler "/usr/bin/gcc" is not able to compile a simple test program.
Run Code Online (Sandbox Code Playgroud)
但是,正如您可能已经注意到的那样,我设置了libquadmath.a的位置; 当我构建一个不使用X11但在使用时使用quadmath的程序
set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -static")
Run Code Online (Sandbox Code Playgroud)
然后程序成功编译(运行ldd报告'不是动态可执行文件') - 这是否意味着错误已经修复,或者只是因为我在CMake中设置了位置?
我想你的问题没有那么相关,我不知道所有问题的答案。
对于静态链接问题,由于您使用的是 GCC,因此可以向其传递多个 -static 和 -dynamic 标志:
set(CMAKE_EXE_LINKER_FLAGS "-static ${STATIC_LIBS} -dynamic ${EVERYTHING ELSE} -static ${MORE_STATIC_LIBS}")
Run Code Online (Sandbox Code Playgroud)
我不知道为什么Xaw.a在您的系统上不可用,可能是因为您的 Linux 发行版的软件包维护者并没有真正使它们可用。
此外,将所有内容编译为静态可能会使所有发行版之间不兼容,并且会削弱其他人在您的程序中使用改进的最新库的能力,这可能不是您想要的。
如果您打算制作一个独立的程序包,那么最好只包含您一起使用的共享库,就像 Dropbox 和许多其他专有应用程序所做的那样(Humble Bundle 游戏是其他示例)。
| 归档时间: |
|
| 查看次数: |
4852 次 |
| 最近记录: |