标签: static-libraries

C++静态库可以链接到共享库吗?

假设我有一个静态C++库,static.lib,我想从C++共享库中调用一些函数,比如shared.lib.可能吗?

现在假设我有另一个共享库,比如shared2.lib链接到static.lib但没有链接到shared.lib.在这种情况下,链接器是否会自动将shared2.lib链接到shared.lib?

我正在使用Microsoft Visual Studio 2003.

c++ shared-libraries static-libraries visual-c++

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

如何使用binutils链接器处理静态库之间的递归依赖?

我正在将现有系统从Windows移植到Linux.构建由多个静态库构成.我遇到了一个链接错误,其中在libB的对象中找不到符号(在libA中定义).链接器行看起来像

g ++ test_obj.o -lA -lB -o test

当然是由时间链接器找到它需要从利巴符号的问题,它已经过去了吧,不会重新扫描,因此它只是出现了错误,即使符号是有服用.

我最初的想法当然是简单地交换链接(到-lB -lA),以便之后扫描libA,并且拾取libA中缺少的任何符号.但后来我发现libA和libB之间实际上存在递归依赖关系!我假设Visual C++链接器以某种方式处理它(默认情况下是否重新扫描?).

处理这个问题的方法我考虑过:

  • 使用共享对象.不幸的是,从需要PIC补偿的角度来看这是不可取的(这是性能敏感的代码并且丢失%ebx以保持GOT真的会受到伤害),并且不需要共享对象.

  • 构建所有对象的一个​​巨大的ar,避免问题.

  • 重构代码以避免递归依赖(这显然是正确的事情,但我试图用最小的更改来做这个端口).

你有其他想法来解决这个问题吗?有没有什么方法可以说服binutils链接器执行它已经在缺少符号时已经查看过的库的重新扫描?

linker dependencies gcc static-libraries binutils

15
推荐指数
2
解决办法
5926
查看次数

链接器故障:如何确定"/ DEFAULTLIB"的来源

我试图找到一种很好的方法来确定链接时的哪个模块导致某个库被处理为"/ DEFAULTLIB",如Visual Studio的详细链接器输出中所示.

这是我的情况,我有几个静态库先决条件,每个都有一个发布和一个调试版本(BlahD.lib和Blah.lib).由于某种原因,在链接时,所有*D.lib都被处理为默认库,即使我正在构建一个版本,其中非调试库被指定为"附加依赖项".如果我从不构建静态库的调试版本那些*D文件将不存在,并且会出现链接器错误(无法打开文件).

通过为所有这些违规的.lib文件指定/ NODEFAULTLIB,我可以成功构建我的项目.所有发布库都链接起来,每个人都很高兴.但我想了解这里发生了什么.是什么导致链接器处理这些*D.lib文件?我唯一的希望是编写某种脚本,在这个庞大的项目及其依赖项目(微软支持)中抛弃一切?即使这样我也不明白在dumpbin输出中要查找什么,这是否适用于.lib文件以及.obj文件?

c++ linker static-libraries visual-studio

15
推荐指数
2
解决办法
4412
查看次数

尽管ObjC标志,"无法识别的选择器发送到实例"到静态库

我的应用程序中出现运行时错误:

2011-05-17 09:42:31.124 rxsync[67464:207] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[NSMutableURLRequest setHTTPBodyWithFormMultipartValues:fileNames:contentTypes:usingBoundary:]: unrecognized selector sent to instance 0x4e3cd90'

此方法NSMutableURLRequest setHTTPBodyWithFormMultipartValues: fileNames: contentTypes: usingBoundary:]由静态库定义,该库是我的.xcworkspace的一部分.

这是我到目前为止检查的内容:

  1. 静态库包含在我的Link Binary With Libraries阶段.
  2. OTHER_LDFLAGS = -ObjC在我的应用程序中的其他链接器标志()中有ObjC .(事实上​​,我也在静态库中使用它,因为它基于相同的xcconfig文件.)
  3. 我的.h和.m文件中的签名是相同的.
  4. 静态库已经肯定被重建.
  5. 我已经验证我发送消息的对象是有效的.

我错过了哪些可能性?

我正在使用Xcode 4.0.2.这是iPhone的目标.

xcode static-libraries

15
推荐指数
1
解决办法
5008
查看次数

如何从iOS中的现有框架创建静态库?

我已经为第三方供应商提供了一个用于iPhone硬件配件的框架.所以我有一个像Device.framework这样的文件夹.在该文件夹中是一个二进制文件和一组.h文件.有关如何将其添加到iOS项目并使用其中包含的类的说明.但是,我实际上正在使用MonoTouch并且想要使用静态库.

有没有办法创建一个静态库,使静态库中的框架中的所有类都可用?因此,在我的MonoTouch项目中,我将链接到静态库并可以访问该框架.

frameworks static-libraries xamarin.ios ios

15
推荐指数
2
解决办法
6218
查看次数

iOS静态库调试符号未包含在dSYM中

我正在研究一系列将共享公共代码库的iOS应用程序.我已经将公共代码库开发为静态库,并希望它的调试符号包含在主应用程序的.dSYM文件中.我的理解是这是可能的,但我还没有完成它的工作.

它自己的项目中的公共代码库,它有一个静态库作为目标.该项目被拖入主应用程序的项目中.在主要应用程序的目标构建阶段中,我已将静态库添加为目标依赖项,并在"链接二进制文件库"下添加.该项目根据需要构建和运行.

现在,如果我从主项目生成存档,我可以在Finder中查看该存档,它包含一个可用于表示崩溃日志的.dSYM文件.但是,.dSYM仅包含主应用程序的符号,而不包含静态库的符号.为了过度确认这一点,我运行了以下内容:

dwarfdump /path/to/app.dSYM

输出(大多数)不包含静态库中的任何符号.我发现的唯一例外是我的主项目的AppDelegate是静态库中对象的子类,并且.dSYM中有超类的条目.但是,没有其他类存在.

在静态库的项目目标的Build Settings中,我设置了以下内容:

  • 复制期间剥离调试符号:NO
  • 剥离链接产品:没有
  • 生成调试符号:是
  • 默认隐藏的符号:否

如果有人能提供一些指导,我将不胜感激.

debugging linker static-libraries ios

15
推荐指数
1
解决办法
5770
查看次数

如何避免#include依赖于外部库

如果我正在创建一个带有头文件的静态库,例如:

// Myfile.h

#include "SomeHeaderFile.h" // External library

Class MyClass
{

// My code

};
Run Code Online (Sandbox Code Playgroud)

在我自己的项目中,我可以告诉编译器(在我的情况下,Visual Studio)在哪里查找SomeHeaderFile.h.但是,我不希望我的用户关注这一点 - 他们应该能够包含我的头,而不必通知他们的编译器有关SomeHeaderFile.h的位置.

这种情况通常如何处理?

c++ dependencies header-files static-libraries

15
推荐指数
1
解决办法
4854
查看次数

C:使用Makefile创建静态库和链接

我试图了解静态和共享库.

我想要执行以下操作来创建一个makefile,它将单独的编译和链接分开,以便在形成最终的静态可执行文件时创建和链接静态库.

我有Makefile的以下代码,但我收到以下错误

Makefile:13: *** missing separator. Stop.

但我也试图了解如何实际链接/创建库.

如果我line 12在终端中运行命令后它们工作,而不是在makefile中.

myProgram: main.o addSorted.o freeLinks.o
    gcc -lm -o myProgram main.o addSorted.o freeLinks.o

main.o: main.c
    gcc -O -c -lm main.c main.h

addSorted.o: addSorted.c addSorted.h
    gcc -O -c -lm addSorted.c

freeLinks.o: freeLinks.c freeLinks.h
    gcc -O -c -lm freeLinks.c

ar rc libmylib.a main.o addSorted.o freeLinks.o    //Error Line

ranlib libmylib.a

gcc -o foo -L. -lmylib foo.o

clean:
    rm -f myProgram main.o addSorted.o freeLinks.o
Run Code Online (Sandbox Code Playgroud)

此外,如果您可以协助改进代码,我将非常感激.

c makefile static-libraries

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

Android Gradle添加静态库

在旧的传统android ndk中,我们将指定要在Android.mk文件中链接的静态库.

Android.mk

PLATFORM_PREFIX := /opt/android-ext/
LOCAL_PATH := $(PLATFORM_PREFIX)/lib
include $(CLEAR_VARS)
LOCAL_MODULE := library
LOCAL_SRC_FILES := library.a
include $(PREBUILT_STATIC_LIBRARY)

LOCAL_STATIC_LIBRARIES := android_native_app_glue library
Run Code Online (Sandbox Code Playgroud)

这是我的问题

切换到NDK的Gradle实验插件时,我有点困惑.分享您如何在App build.gradle文件中链接静态库的想法.

我按照这里给出的最新gradle实验插件文档.

android static-libraries gradle android-ndk

15
推荐指数
1
解决办法
1万
查看次数

减少Qt GUI应用程序的大小

我正在学习使用Qt Creator开发应用程序.我在Windows下构建了一个简单的应用程序,取决于使用mingwm10.dll,QtCore4.dll,QtGui4.dll,QtNetwork4.dll.在QtQui4.dll之外,我只使用了几个小部件,并且不需要所有其他的...是否可以缩小QtGui4.dll的大小或者做其他事情以减少应用程序的部署大小?静态链接怎么样?它会嵌入整个dll,还是只使用它的一部分?还有可能Qt静态地和一些动态链接一些dll吗?

c++ dll qt static-libraries

14
推荐指数
2
解决办法
7174
查看次数