强制 CMake 使用静态库

2023-11-27

[无耻地从 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")
    

使用这些,CMake 尝试构建every静态编程(如预期)-但是,它失败了,因为我没有Xaw.a- 我不知道这是否真的应该存在。我已经安装了最新的libxaw7-dev我期待修复它。一种选择是自己编译 X11 库,但我真的不想这样做......

  • 如果我只注释掉set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -static"),然后 CMake 编译所有内容,but即使我指定了每个程序的位置,也使用共享库.a我的 X11 库find_library()来电。我期望 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
    

结果是

-- 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.

However正如您可能已经注意到的,我设置了 libquadmath.a 的位置;当我构建一个不使用 X11 但使用quamath 的程序时

set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -static")

然后程序确实编译成功(运行 ldd 报告“不是动态可执行文件”) - 这是否意味着错误已被修复,或者它只是因为我在 CMake 中设置了位置而起作用?


我也有类似的问题。事实证明,cmake 隐式链接了 libgfortran 和 libquadmath。为了解决这个问题,我将以下内容放入我的顶级 CMakeLists.txt 中:

unset(CMAKE_Fortran_IMPLICIT_LINK_LIBRARIES)

然后我可以使用以下命令再次显式链接库:

SET_TARGET_PROPERTIES(main_f PROPERTIES LINKER_LANGUAGE "C"
  LINK_FLAGS
  "/usr/local/Cellar/gcc/7.1.0/lib/gcc/7/libgfortran.a 
  /usr/local/Cellar/gcc/7.1.0/lib/gcc/7/libquadmath.a -lm -lgcc"
)

libgfortran 的静态版本是必要的,因为共享库还依赖于 libquadmath。添加的“-lm”和“-lgcc”引入了这些库的系统动态版本。在 Mac 系统上,您还需要使用 libm.a 的完整路径。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

强制 CMake 使用静态库 的相关文章

随机推荐

  • Git 子模块在 TFS Build 上失败

    当我尝试使用 TFS 和 Git 进行构建时 存在一个限制 即 TFS 的 git 提供程序尚不支持子模块 有点痛苦 但到底是什么 我可以告诉 TFS 在编译之前运行批处理文件 我用它来调用手动 git 脚本来更新我的 超级 项目中的所有子
  • 从 GitHub 操作推送到源

    我正在努力推动origin远程 GitHub 操作 我的行动逻辑是 handle pull request review事件并按评论消息过滤 签出到 master 合并 PR 分支 运行一些检查并将其推送到origin 脚本是 if GIT
  • Phoenix 框架中的动态模型

    有没有办法在Phoenix中动态创建和使用模型 我有一个存储有关客户表的元数据的应用程序 它们设置了一些字段 列名称和类型 然后向我发送 CSV 文件以进行解析和存储 我想根据存储的元数据生成一个模型 以便我可以使用 Ecto 来管理客户端
  • PyUSB 后端无法访问

    嘿 我正在尝试运行教程中提供的简单脚本 USB 正在导入 但是当我尝试搜索设备时出现以下错误 请帮助 gt gt gt dev usb core find Traceback most recent call last File
  • Java套接字的PrintWriter线程安全吗?

    所以 我有两个线程 线程一管理客户端连接 只有一台客户端和一台服务器 我将其称为我的服务器线程 线程二管理向客户端发送消息 我将其称为我的消息处理器线程 线程一负责定期向客户端发送心跳 在编程时 我假设套接字不是线程安全的 但缓冲区是 只要
  • 梯度方向计算

    我正在计算机视觉课程中完成我的任务 子任务之一是基于图像亮度的梯度方向计算 我制作了一个明亮 宽度 高度 矩阵 其中包含图像每个像素的亮度值 我有两个这样的功能 double Image grad x int x int y if x wi
  • 在 C# 中使用动态创建的控件

    我正在创建一个应用程序 用户将在其中输入成绩 程序将输出加权平均值 加载时 它将询问作业的类别数量 然后程序将动态创建文本框供用户输入信息 问题是我无法弄清楚如何读取创建文本框后输入的文本 这是我的代码 TextBox txtbx new
  • 泛型类型推断失败?

    实施例A 研究以下片段 public class ExampleA static class Pair
  • android gridview中的分页[关闭]

    Closed 这个问题不符合堆栈溢出指南 目前不接受答案 android gridview 可以分页吗 如果可用 您可以提供任何链接吗 对于水平分页 请在 ViewPager 中使用 GridView 这是一个教程
  • python Socket服务器与真实IP地址

    我正在使用我的 python 服务器 但我已经不再使用 localhost 我想通过互联网进行访问 到目前为止我的代码是 import socket import threading import socketserver class Th
  • Maven 可以生成 exe 文件和 mac os x 应用程序吗?

    假设您创建了一个小型 Java 桌面应用程序 其中包含一个 jar 和一些依赖项 可能还有一个许可证文本文件 我知道有很多 Ant 任务可以生成安装程序 可执行文件和正确的 Mac OS X 应用程序 包括将它们打包为 dmg 文件 例子是
  • 将静态 constexpr 类成员分配给运行时变量

    我知道有很多类似的问题 但又有些不同的问题 这是关于以下情况 include
  • 如何在 Linux 中轻松接收邮件并将其提供给 Rails?

    我整晚都在谷歌上搜索 postfix howto 但仍然不明白我如何在 linux 服务器上接收电子邮件 更具体地说 Ubuntu 我所需要的只是一个包罗万象的邮箱 它可以获取所有电子邮件并将它们提供给 ruby 脚本 当然 然后将其传递给
  • 在 Xamarin.Forms 中自定义进度栏外观

    I used Drawable自定义渲染ProgressBar in Android正如对这个问题但该解决方案不适用于 iOS Below is how it renders in Android Below is how it rende
  • WIX,Dot Net 管理的自定义操作,使用 SQL Server 实例动态填充组合框,MSI

    在 WIX 中 我需要一个点网管理的自定义代码来动态填充该网络中 sql server 实例的值的组合框 我尝试用谷歌搜索但没有任何效果 任何帮助是极大的赞赏 CustomAction public static ActionResult
  • 未找到 Gradle DSL 方法:“compile()”

    我有这个梯度错误 错误 9 0 未找到 Gradle DSL 方法 compile 我曾尝试参考类似的问题 但没有成功 Android gradle 构建错误 9 0 未找到 Gradle DSL 方法 compile 同步 Build G
  • 为什么在 C++0x 中没有为 std::weak_ptr 定义 std::hash ?

    在阅读了关于 std weak ptr 的 operator 编辑 关于 std weak ptr 的运算符http www open std org jtc1 sc22 wg21 docs papers 2004 n1590 html 我
  • AngularJS:如何监听 DOM 事件?

    我是 AngularJS 的新手 所以请原谅我这个转储问题 如何监听 dom 事件 例如 click 或 mousemove 这就是我得到的 没有错误 但控制台中也没有结果 代码基于原始的 angularjs seed angular mo
  • 超类访问检查失败:类 com.sun.javafx.sg.prism.web.NGWebView

    我刚刚安装了 SDK 11 并使用了 Maven 中的 Javafx 我的 pom 如下
  • 强制 CMake 使用静态库

    无耻地从 CMake 帮助列表中交叉发布 我正在尝试尽可能静态地创建二进制文件 我得到的 Fortran 代码有 X11 和quadmath 作为依赖项 并且我遇到了许多问题 也许每个问题都应该在不同的问题中 我的变量目前是 set CMA