标签: static-libraries

objcopy 对静态库的不可预见的后果

背景

我有一组三个几乎相同的静态库(用 编译-fPIC),我无法重新编译它们。所有库都导出相同的符号,因此我将它们捆绑在一起的唯一方法是通过 为每个静态库修改带有前缀的符号objcopy,即:

for i in pineapple coconut banana
do
    objcopy --prefix-symbols=${i}_ lib${i}.a
done
Run Code Online (Sandbox Code Playgroud)

现在,我拥有三个具有独特符号的库,并且可以继续编写标头来处理每个库的三个近乎重复的标头/API 文件。


问题

像这样重命名库的导出符号安全吗?它是否有任何可能导致运行时稳定性问题的“陷阱”或不可预见的后果?库本身内对符号的所有引用是否都会自动更正,或者某些库代码(除了调用之类的代码之外dlsym())是否可能会尝试引用旧符号和段错误?

c linker gcc static-libraries objcopy

3
推荐指数
1
解决办法
996
查看次数

在 Linux 系统上使用 C++ 链接到共享库和静态库

我正在搞一个测试项目,让我们称之为它mytest,它有一个 .cpp 和一个 .h 文件,内容并不重要 - 想象它包含一些简单的hello_world()类型函数......

因此,我正在制作一个通用的 makefile 将其编译到各种库输出中,其中ls -l我的输出文件夹给出:

libmytest.a
libmytest.so -> libmytest.so.1.0
libmytest.so.1 -> libmytest.so.1.0
libmytest.so.1.0
Run Code Online (Sandbox Code Playgroud)

到目前为止一切顺利,我的共享/静态库已创建。

现在我的 make 文件中有一个make install目标,它基本上将标头复制到/usr/local/include,并将所有这些库文件复制到/usr/local/lib

然后我制作了另一个测试 cpp 文件usertest.cpp(抱歉,名称不是很有想象力/描述性),它链接到库文件。

我通过多种方式编译:

  1. g++ -Wall -Werror -I. -lmytest
  2. g++ -Wall -Werror -I. -lmytest -static

然后我删除了 libmytest.so* 文件,所以我只有 libmytest.a 库文件然后/usr/local/lib我做了同样的测试:

  1. g++ -Wall -Werror -I. -lmytest
  2. g++ -Wall -Werror -I. -lmytest -static

最后我删除了 libmytest.a 文件并复制回 .so 文件,因此我只有 libmytest.so* 库文件然后/usr/local/lib …

c++ shared-libraries static-libraries lib

3
推荐指数
1
解决办法
4483
查看次数

我可以使某些符号仅对其他库成员可见吗?

考虑 3 个 C 源文件:

/* widgets.c */
void widgetTwiddle ( struct widget * w ) {
    utilityTwiddle(&w->bits, 1);
}
Run Code Online (Sandbox Code Playgroud)

/* wombats.c */
void wombatTwiddle ( struct wombat * w ) {
    utilityTwiddle(&w->bits, 1);
}
Run Code Online (Sandbox Code Playgroud)

/* utility.c */
void utilityTwiddle ( int * bitsPtr, int bits ) {
    *bitsPtr ^= bits;
}
Run Code Online (Sandbox Code Playgroud)

它被编译并放入库中(例如 libww.a 或 libww.so)。有没有办法让utilityTwiddle()其他两个库成员可见和可用,但对链接到该库的人不可见?也就是说,考虑到:

/* appl.c */
extern void utilityTwiddle ( int * bitsPtr, int bits );
int main ( void ) {
    int …
Run Code Online (Sandbox Code Playgroud)

c linker symbols shared-libraries static-libraries

3
推荐指数
1
解决办法
1346
查看次数

如何在 Mac 中运行 Makefile

我想在 mac 中创建一个 fat 库。所以我就遵循这个。我将 makefile 的内容复制到编辑文本中并将其重命名为Makefile.mak. 我打开了 makefile 所在的终端,并在终端中键入“make”并按 Enter 键。我收到错误“找不到 Makefile”。这会是什么原因呢?我哪里做错了?请帮我。谢谢

makefile static-libraries fat-binaries xamarin.ios

3
推荐指数
2
解决办法
4万
查看次数

有没有办法知道在目标文件中导出哪些符号?

嗨,我在Linux环境中工作,我必须链接到已编译的目标文件,它提供了一些服务(services.o),我知道其中一些,但我想知道哪些都是导出的它的符号.

有没有办法实现这个没有来源?如果是这样,怎么样?

非常感谢你.

c symbols export static-libraries object-files

2
推荐指数
1
解决办法
201
查看次数

混淆可重用iOS包的Objective-C代码

可能重复:
Objective-C代码混淆

我正在尝试整合一个可以在多个应用程序中重用的iOS包.我希望能够将其捆绑给其他人以便轻松插入和使用,我想混淆代码,以便没有人可以阅读它.

在构建框架,静态库或其他解决方案以实现此目的和原因之间,您会建议什么?

obfuscation frameworks objective-c static-libraries ios

2
推荐指数
1
解决办法
4165
查看次数

如何在C中设计静态库的接口

虽然我不是C语言的经验丰富的程序员,但我必须在工作中使用这种语言来构建一个静态库,它可以在SunOS和Win32上编译.这个库只有几个源文件及其相应的头文件(让我们说:a.c,b.c,a.hb.h).项目在两个平台中编译,并mylib.a生成库.

我的问题是如何将实现的函数暴露mylib.a给其他项目,因为当我添加两者时a.h,b.h我得到一些宏重定义错误.

编辑:我发现宏重新定义错误是因为编译命令中的宏定义(与我的标题无关)并且它已经解决了:)但我仍然希望组织我的源文件和头文件.

我怀疑的是我是否修改a.hb.h在外部使用,或者我是否应该专门创建一个头文件来声明这个库的接口(让我们说mylib.h).我不想过度复杂化原始标题,但我不想让同一个标题保持同步...我想听听更有经验的C程序员关于他们的模式,每种方法的优点以及是否还有其他方法选项.

先感谢您.

编辑:似乎我没有提供足够的信息; 下面的模式试图显示我的文件是如何组织的:每个代码文件只包含其标题,每个标题都有一个保护条件,每个标题包含一个公共标题,这个公共标题包括所有标题.

// a.c ----
#include "a.h"

// b.c ----
#include "b.h"

// a.h ----
#ifndef GUARD_A_H
#define GUARD_A_H
  # include "liball.h"
  void function_prototypes_implemented_in_a();
#endif // GUARD_A_H

// b.h ----
#ifndef GUARD_B_H
#define GUARD_B_H
  # include "liball.h"
  void function_prototypes_implemented_in_b();
#endif // GUARD_B_H

// liball.h ----
#ifndef GUARD_LIBALL_H
#define GUARD_LIBALL_H
  # include <time.h>   // …
Run Code Online (Sandbox Code Playgroud)

c static-libraries library-design static-linking

2
推荐指数
1
解决办法
1943
查看次数

将FacebookSDK.framework添加到我自己的静态库中

我正在创建一个静态库,我将用于多个项目,我正在开发.我将构建静态库作为.framework文件,并将拖放到其他项目中使用.它工作正常.现在我在框架中添加更多功能.我将FacebookSDK.framework添加到静态库以进行登录,但是当我将框架拖到另一个项目并构建它时,它会抛出错误.

"FacebookSDK/FacebookSDK.h" file not found.
Run Code Online (Sandbox Code Playgroud)

请帮忙!

frameworks facebook static-libraries ios

2
推荐指数
1
解决办法
3087
查看次数

静态库.导入和导出内联函数

我在实现静态库时出现了这个问题.
我想检查我的猜测并获得有关在静态库中使用内联函数的信息.

  • 我的猜测是静态库的iplementator无法在其库中导出内联函数
    由于内联语句是由编译器实现的(由编译器决定是否使函数内联)通过放置表示操作的低级命令在函数体中到代码段,这样操作就不会放在导出/导入的表中,因此不能被链接器处理,因此不能被librarian包含到静态lib的应用程序代码中被附上.我的逻辑是对的吗?

  • 我想允许导入函数作为内联,但我想知道它是如何实现的,因为它是编译器的责任,但是在链接状态下只有库管理器,所以这意味着它必须采取一些动作才能使函数内联.

c++ linker inline static-libraries

2
推荐指数
1
解决办法
1937
查看次数

从java Web应用程序访问linux本地文件系统

我们在一个web应用程序里面使用一个java库,它托管在apache server.ReadConfFile方法库中,返回文件找不到错误.方法如下

public byte[] ReadConfFile()
{
    try
    {
        File file = new File("/home/product/api/conf.txt");
        if(!file.exists())
            return "file not found".getBytes();
        byte[] buf = new byte[(int) file.length()];

        FileInputStream fis = new FileInputStream(file);
        fis.read(buf);
        return buf;
    } catch (IOException e)
    {
        e.printStackTrace();
        return null;
    }
}
Run Code Online (Sandbox Code Playgroud)

是否允许从Web应用程序访问本地文件系统?如果是,那么是否有必须设置的访问权限?

java linux web-applications static-libraries file-access

2
推荐指数
1
解决办法
4404
查看次数