- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
环境:Intel Linux、Red Hat 5。编译器:gcc 3.4.6(旧东西,具有严重基础设施的遗留环境,抱歉)
我有一个特定共享库的多个版本(称之为“shared_lib.so”),它源自 Fortran,其中包含一个 COMMON block 和引用该 COMMON 中的变量的各种计算。
我需要能够(从最终产品可执行文件中其他地方的 C 代码)在运行时使用 dlclose() 和 dlopen() 在这个库的版本之间切换(其中所有版本的 COMMON 内容都是相同的) .在某些情况下,相同的 COMMON 也出现在作为静态库(称为“static_lib.a”)的一部分的代码中,该库也链接到可执行文件中,并且与我的项目分开维护,但具有与我的共享图书馆。
我似乎看到 COMMON 的多个实例在可执行文件中结束,并且(更重要的是)静态库实例中的变量值与“相同”的值之间没有联系”实例中的变量来自使用 dlopen() 引入的共享库。
总而言之,我需要的是(在整个可执行文件中)加载 dlopen() 的 shared_lib.so 能够在 COMMON ABC 中设置/使用变量 XYZ,以及 static_lib.a 中的代码设置/使用 XYZ,并使其成为 XYZ 的同一个实例,或者至少使两者保持同步。这可能吗?
我对 shared_lib.so 中源代码的编译命令的形式是:
g77 –c –g –m32 -fPIC –o shared_src.o shared_src.f
我构建 shared_lib.so 的命令是这样的形式:
gcc -g -m32 -fPIC -shared -o shared_lib.so *.o
我构建可执行文件的命令是这样的形式:
gcc –g -m32 –rdynamic –o exec exec.o static_lib.a shared_lib.so –lm –ldl –lg2c
我需要从以下形式的 C 代码中做一些事情:
handle1 = dlopen ("shared_lib.so", RTLD_NOLOAD);
dlclose (handle1);
handle2 = dlopen ("shared_lib2.so", RTLD_NOW | RTLD_GLOBAL);
...
对于所需的变量,初始启动配置似乎确实可以正常运行,但后续 dlclose() 和 dlopen() 序列的结果却没有。也许潜在的问题是 dlopen() 缺少 gcc 在链接时拥有的一些智能。
最佳答案
简答
您是否/可以使用 -fPIC
重新编译可执行文件?我发现有必要使用 -fPIC
编译共享库和可执行文件,以便正确识别 COMMON
block 。
长答案
我最近遇到了一个与可执行文件和 FORTRAN 共享库之间共享的 COMMON block 稍微类似的问题。但是,我使用的是 Intel 编译器,而不是 GNU
编译器。可执行文件是 C/C++
和 FORTRAN
的混合体。
代码的现有(工作)Windows 版本通过 DLLEXPORT
/DLLIMPORT
ATTRIBUTE 指令共享可执行文件和 DLL 之间的公共(public) block 来工作。根据 Intel 编译器文档,Linux 无法识别这些属性指令。实际上,Linux Intel 编译器只会为这些指令生成警告。
将代码从 Windows 转换到 Linux 的主要变化是将 Windows LoadLibrary
和 GetProcAddress
替换为 Linux 的 dlopen
和 dlsym
例程,分别使用 #ifdef
部分。共享库使用 -fpic
编译并与 -shared
链接。
虽然共享库是使用 -fpic
编译的,但可执行文件不是。当运行以这种方式编译的代码时,通过子程序调用传递给共享库的变量被正确传递,但是,COMMON
block 变量设置不正确(或未初始化)。
无奈之下,我终于尝试使用 -fpic
编译器选项编译可执行文件本身,然后在共享库中正确识别了 COMMON
block 。
关于c - 可见性、Fortran 公共(public)变量、共享库的运行时加载,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27006442/
这个问题在这里已经有了答案: 关闭 10 年前。 Possible Duplicate: When should [assembly: InternalsVisibleTo()] be used?
问题与微服务有关,当我有多个微服务提供将被订购和计费的功能/服务时。 我正在确定采用哪种方法, a) 每个可计费微服务有一个订单和一个计费服务,有各自的数据库。b) 跨所有微服务的通用订单管理和计费服
我正在尝试使用 gcloud图书馆。 (ns firengine.state (:import [com.google.cloud AuthCredentials] [com.goog
Java 允许定义以下一对类。 class Class1 { ... } public Class2 { public Class2(Class1 c1) { ... } } 如果因为 Class1
我正在尝试查找文件 1 和文件 2 中的共同行。如果公共(public)行存在,我想写入文件 2 中的行,否则打印文件 1 中的非公共(public)行。fin1 和 fin2 是这里的文件句柄。它读
好吧,这是一个满口的标题。不过,这让我明白了。这是我的代码的要点,在 jar 里: public class NetworkShared { public static class Login
我在使用 ltree 时遇到 PHP 问题来自 PostgreSQL .我在 SQL 中这样做: SELECT * FROM tabla t WHERE t.parent_path " for "OP
我知道如何为类/接口(interface)/包的子集生成 Javadoc。但是有没有办法只为公共(public)方法的一个子集生成 Javadoc? 我更喜欢能够将方法(Javadoc 标记或注释)标
这个问题在这里已经有了答案: 关闭 12 年前。 Possible Duplicates: c#: why have empty get set properties instead of usin
在我们的每个项目中,都有一个文件用于存储该项目中使用的各种SQL 语句。类的声明方式和字符串的声明方式有一些变化。 示例类声明: internal sealed class ClassName int
我根据 http://docs.jquery.com/Plugins/Authoring 定义了我的插件 (function( $ ){ var methods = { init : fu
我正在使用 Inno Setup 来构建我的安装程序,我有 C:\Users\Public文件夹硬编码在我的 [Files] 中放置一些文件的部分(Inno Setup 没有此文件夹的常量) 我的目标
我有一个 dataframe1 包含像 'ID', 'A', 'B', 'C', 'D', 'E', 'F', 'G' 这样的列. 现在,我创建了两个数据框, dataframe2 包含 'ID',
我有一个抽象类,不幸的是我无法更改它的定义,它基本上提供了一个抽象方法,有点像。 public abstract void do(Data someData, BaseInterface interf
我刚刚在重构时偶然发现了一段奇怪的代码。它看起来像是分解出两个 readString() 方法的共同部分的候选者,只是它似乎是不可能的(这对我来说是一个令人毛骨悚然的脑筋急转弯): private f
是否有解析为公用文件夹的属性?显然,我不想在目录结构中对“c:\users\public”进行硬编码,但我找不到预定义的 Property解决这个问题。是否有一种可接受的方式来指定要在此处安装和/或在
我试图将值从一个类传递到另一个类。 subPanel1 类读取全局变量,但当我通过调整监听器更新这些变量时,它不会更改值。我试图将 rc、gc 和 bc 变量从 subPanel2 类传递到 subP
我想使用具有自动属性的干净且编码较少的类。所有属性(property)都是公共(public)的。在同一类的方法中我也使用了该属性。因此,我认为这种方法是可混搭的,因为我将公共(public)属性用于
不久前,我在 Android 应用程序中创建了一个 SQLiteHelper 类。我不是 100% 确定原因,但表名和列名是嵌套公共(public)静态抽象类中的公共(public)静态最终字段。我记
这个问题已经有答案了: Cannot make a static reference to the non-static method (8 个回答) 已关闭 3 年前。 我正在为类(class)做一
我是一名优秀的程序员,十分优秀!