当前位置: 首页 > 面试题库 >

链接到可执行文件时,如何强制将目标文件包含在静态库中?

商风华
2023-03-14
问题内容

我有一个C
++项目,由于其目录结构被设置为静态库A,因此链接到共享库中B,而共享库又链接到可执行文件中C。(这是使用CMake的一个跨平台的项目,所以在Windows上我们得到的A.libB.dllC.exe,和在Linux上我们得到的libA.alibB.soC)。图书馆A有一个初始化函数(A_init在定义A/initA.cpp),即从库调用B的初始化函数(B_init,在中定义B/initB.cpp),这是从C的main
调用的。因此,在链接时BA_init(以及中定义的所有符号initA.cpp)都被链接到B(这是我们期望的行为)。

问题在于,该A库还定义了旨在动态加载的函数(Af在中定义A/Afort.f)(即LoadLibrary/
GetProcAddress在Windows上和dlopen/
dlsym在Linux上)。由于没有对Affrom库的引用,因此from中的B符号A/Afort.o不包含在中B。在Windows上,我们可以使用编译指示人为地创建引用:

#pragma comment (linker, "/export:_Af")

由于这是一个实用程序,因此它仅适用于Windows(使用Visual Studio
2008)。为了使其在Linux上运行,我们尝试将以下内容添加A/initA.cpp

extern void Af(void);
static void (*Af_fp)(void) = &Af;

这不会导致符号Af包含在的最终链接中B。我们如何强制将符号Af链接到B


问题答案:

原来,我最初的尝试大部分都在那儿。以下作品:

extern "C" void Af(void);
void (*Af_fp)(void) = &Af;

对于那些想要一个独立的预处理器宏来封装它的人:

#if defined(_WIN32)
# if defined(_WIN64)
#  define FORCE_UNDEFINED_SYMBOL(x) __pragma(comment (linker, "/export:" #x))
# else
#  define FORCE_UNDEFINED_SYMBOL(x) __pragma(comment (linker, "/export:_" #x))
# endif
#else
# define FORCE_UNDEFINED_SYMBOL(x) extern "C" void x(void); void (*__ ## x ## _fp)(void)=&x;
#endif

因此使用:

FORCE_UNDEFINED_SYMBOL(Af)


 类似资料:
  • 查看.a静态库包含的目标文件 借助ar这个工具验证.a文件是.o文件的合集, 加上参数-t, 以AFN生成.a为例 ❯ ar -t /Users/shenyj/Documents/CodeForTest/staticLib/AFNetworking/libAFNetworking.a __.SYMDEF 输出结果 AFAutoPurgingImageCache.o AFHTTPS

  • 问题内容: 大家好,菜鸟Java问题。 我有一个Java项目,并且想在可执行jar中包含一个文本文件。现在,该文本文件位于默认程序包中。 InputFlatFile currentFile =新的InputFlatFile(“ src / theFile.txt”); 正如您使用src所看到的那样,我使用该行抓取文件。但是,这不适用于可执行jar。 有人可以让我知道如何将文件保存在可执行jar中,

  • 问题内容: 嗨,我目前正在为我正在编写的编译器生成x86程序集,并且在将文件链接到我的64位VM(程序集代码为32位)时遇到一些麻烦。 我可以使用以下命令很好地汇编目标文件: 但我似乎找不到任何使它生成32位ELF文件的选项: 任何帮助都会很棒。 问题答案: 您可以通过以下方式获得可用架构的列表: 样本输出: 但是,这不是必须的:ld查看第一个对象,并应根据该对象的格式自动选择仿真。

  • 问题内容: 有人知道如何使用GCC将任何资源文件静态地直接编译到可执行文件或共享库文件中吗? 例如,我想要添加永不更改的图像文件(如果更改,则无论如何我都必须替换该文件),并且不希望它们位于文件系统中。 如果这是可能的(我认为是因为Windows的Visual C ++也可以这样做),如何加载存储在自己的二进制文件中的文件?可执行文件会自行解析,查找文件并从中提取数据吗? 也许我还没有看到GCC的

  • 我需要创建一个应用程序,使用各种参数,如高度,体积或基础面积排序各种类型的多边形。将通过命令行传递具有多边形参数、排序类型参数、排序方法参数的文件名的参数。该文件位于项目中的“我的资源”文件夹中的“我的src”文件夹之外。我已经实现了所有的程序,当我通过eclipse运行配置使用pass参数运行时,它工作得很好。但是当我尝试使用cmd相同的参数运行我的.jar文件时,它给出了。 我使用打开了我的j

  • 问题内容: 如何将JavaScript文件正确链接到HTML文档? 其次,如何在JavaScript文件中使用jQuery? 问题答案: 首先,您需要从http://jquery.com/下载JQuery库,然后以以下方式在html head标记中加载jquery库 那么您可以通过在jquery加载脚本之后编码您的jquery代码来测试jquery是否正常工作 如果要单独使用jquery脚本文件,