我有一组三个几乎相同的静态c库(用 编译-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())是否可能会尝试引用旧符号和段错误?
我正在搞一个测试项目,让我们称之为它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(抱歉,名称不是很有想象力/描述性),它链接到库文件。
我通过多种方式编译:
g++ -Wall -Werror -I. -lmytestg++ -Wall -Werror -I. -lmytest -static然后我删除了 libmytest.so* 文件,所以我只有 libmytest.a 库文件然后/usr/local/lib我做了同样的测试:
g++ -Wall -Werror -I. -lmytestg++ -Wall -Werror -I. -lmytest -static最后我删除了 libmytest.a 文件并复制回 .so 文件,因此我只有 libmytest.so* 库文件然后/usr/local/lib …
考虑 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) 我想在 mac 中创建一个 fat 库。所以我就遵循这个。我将 makefile 的内容复制到编辑文本中并将其重命名为Makefile.mak. 我打开了 makefile 所在的终端,并在终端中键入“make”并按 Enter 键。我收到错误“找不到 Makefile”。这会是什么原因呢?我哪里做错了?请帮我。谢谢
嗨,我在Linux环境中工作,我必须链接到已编译的目标文件,它提供了一些服务(services.o),我知道其中一些,但我想知道哪些都是导出的它的符号.
有没有办法实现这个没有来源?如果是这样,怎么样?
非常感谢你.
可能重复:
Objective-C代码混淆
我正在尝试整合一个可以在多个应用程序中重用的iOS包.我希望能够将其捆绑给其他人以便轻松插入和使用,我想混淆代码,以便没有人可以阅读它.
在构建框架,静态库或其他解决方案以实现此目的和原因之间,您会建议什么?
虽然我不是C语言的经验丰富的程序员,但我必须在工作中使用这种语言来构建一个静态库,它可以在SunOS和Win32上编译.这个库只有几个源文件及其相应的头文件(让我们说:a.c,b.c,a.h和b.h).项目在两个平台中编译,并mylib.a生成库.
我的问题是如何将实现的函数暴露mylib.a给其他项目,因为当我添加两者时a.h,b.h我得到一些宏重定义错误.
编辑:我发现宏重新定义错误是因为编译命令中的宏定义(与我的标题无关)并且它已经解决了:)但我仍然希望组织我的源文件和头文件.
我怀疑的是我是否修改a.h并b.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) 我正在创建一个静态库,我将用于多个项目,我正在开发.我将构建静态库作为.framework文件,并将拖放到其他项目中使用.它工作正常.现在我在框架中添加更多功能.我将FacebookSDK.framework添加到静态库以进行登录,但是当我将框架拖到另一个项目并构建它时,它会抛出错误.
"FacebookSDK/FacebookSDK.h" file not found.
Run Code Online (Sandbox Code Playgroud)
请帮忙!
我在实现静态库时出现了这个问题.
我想检查我的猜测并获得有关在静态库中使用内联函数的信息.
我的猜测是静态库的iplementator无法在其库中导出内联函数
由于内联语句是由编译器实现的(由编译器决定是否使函数内联)通过放置表示操作的低级命令在函数体中到代码段,这样操作就不会放在导出/导入的表中,因此不能被链接器处理,因此不能被librarian包含到静态lib的应用程序代码中被附上.我的逻辑是对的吗?
我想允许导入函数作为内联,但我想知道它是如何实现的,因为它是编译器的责任,但是在链接状态下只有库管理器,所以这意味着它必须采取一些动作才能使函数内联.
我们在一个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应用程序访问本地文件系统?如果是,那么是否有必须设置的访问权限?
static-libraries ×10
c ×4
linker ×3
c++ ×2
frameworks ×2
ios ×2
symbols ×2
export ×1
facebook ×1
fat-binaries ×1
file-access ×1
gcc ×1
inline ×1
java ×1
lib ×1
linux ×1
makefile ×1
obfuscation ×1
objcopy ×1
object-files ×1
objective-c ×1
xamarin.ios ×1