标签: static-libraries

链接具有内联函数的静态库的问题

我有一个静态库,其中(除其他外)实现了一个微小的函数,只返回一个const字符串表中的字符串.此函数不会在库中的任何位置调用,但仍然声明为inline.为清楚起见,它看起来像这样:

namespace flow
{
    inline const char* GetName( BYTE methodType );
}
Run Code Online (Sandbox Code Playgroud)

和实施:

const char* flow::GetName( BYTE methodType )
{
    if ( methodType < 5 )
        return cszNameTable[ methodType ];

    return NULL;
}
Run Code Online (Sandbox Code Playgroud)

在另一个项目中,我正在链接这个库.我有正确的.h文件,我有using namespace flow;我的代码.问题是,我收到链接器错误:

error LNK2001: unresolved external symbol "char const * __cdecl flow::GetName(unsigned char)" (?GetName@flow@@YAPBDE@Z)
Run Code Online (Sandbox Code Playgroud)

现在我可以通过从静态库中的函数声明中删除"inline"关键字来轻松解决此问题.所以这是我的问题:

1)为什么会出现此错误?如何在不修改静态库源代码的情况下修复它(不删除内联关键字)?

2)inline未在库本身内部调用的静态库函数中使用关键字有什么好处?inline当从另一个项目链接到库时,关键字是否有任何影响(我猜它确实如此,但我不确定)?

c++ linker inline static-libraries

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

对我自己的库的未定义引用

我用几个创建了我的lib.a文件

gcc -c file.c -o file.o
Run Code Online (Sandbox Code Playgroud)

然后

ar sr lib/libtest.a file1.o file2.o file3.o
Run Code Online (Sandbox Code Playgroud)

确认

ar -t lib/libtest.a
file1.o
file2.o
file3.o
Run Code Online (Sandbox Code Playgroud)

但是当我尝试编译测试应用程序时

gcc lib/libtest.a test.c -o test
Run Code Online (Sandbox Code Playgroud)

我在函数中得到了未定义的引用main:来自file1.o,file2.o,file3.o的函数

c gcc static-libraries unix-ar undefined-reference

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

Android:如何使用JNI代码中的现有C++静态库?

我已经看到了类似于这个问题的问题,但情景并不完全相同,我也无法找到适用于我的问题的答案.

我有一个C++库的源代码.我们需要将此库用作Android应用程序的一部分,但它也需要可供第三方用作C++库.

我有一个makefile,使用ndk的编译器从库的源代码生成.a文件.那是纯粹的C++部分.

在Java部分,我有一个简单的演示项目,其中包含一个包含按钮的简单活动.按下按钮时,将调用本机代码.

只要我不尝试从JNI函数调用库中的函数,一切正常.

以下是图书馆的来源:

SimpleMath.h

int Add(int aNumber1, int aNumberB);
Run Code Online (Sandbox Code Playgroud)

SimpleMath.cpp

#include "SimpleMath.h"

int Add(int aNumberA, int aNumberB)
{
  return aNumberA + aNumberB;
}
Run Code Online (Sandbox Code Playgroud)

生成文件

APP      = simple_app
LIBRARY  = simple_library.a
OBJECTS  = SimpleMath.o
CFLAGS   = -Wall -pedantic
NDK_PATH = /home/jug/perforce/jug_navui_personal_main/Env/Linux/Android/ndk/r7c
CXX      = $(NDK_PATH)/toolchains/arm-linux-androideabi-4.4.3/prebuilt/linux-x86/bin/arm-linux-androideabi-g++
AR       = $(NDK_PATH)/toolchains/arm-linux-androideabi-4.4.3/prebuilt/linux-x86/bin/arm-linux-androideabi-ar
SYSTEM_LIBS = -lstdc++ -lm
INCLUDE_PATH += ${NDK_PATH}/platforms/android-9/arch-arm/usr/include

all: $(LIBRARY)

$(LIBRARY): 
    $(CXX) -c SimpleMath.c
    $(AR) rcs simple_library.a SimpleMath.o

clean:
    rm *.o *.a
Run Code Online (Sandbox Code Playgroud)

在java方面,这些是文件:

你好,jni.c

#include <string.h>
#include <jni.h>

#include "../../../native/simple_library/SimpleMath.h"

jstring …
Run Code Online (Sandbox Code Playgroud)

c++ java-native-interface android static-libraries

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

我知道库中的链接器错误在项目中

所以我正在使用3dar SDK,构建一个实现sdk和生成的SM3Dar.h头的独立应用程序没有问题.但是现在我正在尝试使用相同的sdk作为更大项目的一部分,它似乎没有正常运行.看起来它知道头文件在那里但是没有与那个和库正确通信.我正试图在iPhone 5上运行它,我有最新的XCode.

但我收到这些错误

Undefined symbols for architecture armv7s:
  "**___cxa_pure_virtual", referenced from**:
      vtable for Comparable in lib3DAR_v23_2012_12_06_DistributionPatch_2013_05_18.a(FloatObject.o)
  "**vtable for __cxxabiv1::__si_class_type_info", referenced from:**
      typeinfo for ComboVertex in lib3DAR_v23_2012_12_06_DistributionPatch_2013_05_18.a(FloatObject.o)
      typeinfo for ObjDB in lib3DAR_v23_2012_12_06_DistributionPatch_2013_05_18.a(ObjDB.o)
  NOTE: a missing vtable usually means the first non-inline virtual member function has no definition.
  **"operator new[](unsigned long)", referenced from:**
      Array<FloatPolygon>::Array(int, int) in lib3DAR_v23_2012_12_06_DistributionPatch_2013_05_18.a(Geometry.o)
      Array<FloatVertex>::Array(int, int) in lib3DAR_v23_2012_12_06_DistributionPatch_2013_05_18.a(Geometry.o)
      Array<CString>::Array(int, int) in lib3DAR_v23_2012_12_06_DistributionPatch_2013_05_18.a(ObjFile.o)
      Array<Vector3>::resize(int) in lib3DAR_v23_2012_12_06_DistributionPatch_2013_05_18.a(FloatObject.o)
      Array<Vector3>::Array(int, int) in lib3DAR_v23_2012_12_06_DistributionPatch_2013_05_18.a(FloatObject.o)
      Array<unsigned char>::resize(int) in lib3DAR_v23_2012_12_06_DistributionPatch_2013_05_18.a(FloatObject.o)
      Array<unsigned char>::Array(int, int) in lib3DAR_v23_2012_12_06_DistributionPatch_2013_05_18.a(FloatObject.o) …
Run Code Online (Sandbox Code Playgroud)

linker static-libraries ios

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

在VS2012和Win32/64下将静态boost构建链接到静态库

我正在尝试构建一个静态库,作为网络设备的API发布.我可以成功编译和链接库以生成.lib输出文件,并将它们重定位到目录结构中,如下所示:

EyeLib
 L-Include
 |  L-PublicInterface.h
 L-Lib
 |  L-debug
 |  |   L-MyLib.lib
 |  |   L-MyLib.pdb
 |  L-release
 |      L-MyLib.lib
 L-MyLibConfig.cmake
Run Code Online (Sandbox Code Playgroud)

MyLibConfig.cmake文件非常简单,包含:

# the header file is relative to this cmake file, so get the path.
GET_FILENAME_COMPONENT( MyLib_TOPLEVEL_DIR ${CMAKE_CURRENT_LIST_FILE} PATH )
SET( MyLib_INCLUDE_DIR ${MyLib_TOPLEVEL_DIR}/include )

IF( WIN32 )
  FIND_LIBRARY( MyLib_DEBUG_LIBRARY MyLib ${MyLib_TOPLEVEL_DIR}/lib/debug )
  FIND_LIBRARY( MyLib_RELEASE_LIBRARY MyLib ${MyLib_TOPLEVEL_DIR}/lib/release )
  SET( MyLib_LIBRARIES optimized ${MyLib_RELEASE_LIBRARY} debug ${MyLib_DEBUG_LIBRARY} )
ENDIF( WIN32 )
IF( UNIX )
  FIND_LIBRARY( MyLib_LIBRARY MyLib ${MyLib_TOPLEVEL_DIR}/lib )
  SET( MyLib_LIBRARIES "${MyLib_LIBRARY}" )
  MARK_AS_ADVANCED( MyLib_LIBRARY …
Run Code Online (Sandbox Code Playgroud)

boost cmake static-libraries visual-studio visual-studio-2012

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

在Haskell中获取平方根的整数部分

假设我有一个整数的类型Integer.是否存在一个库功能(在前奏或其他地方),该给定的时Integer X将返回的平方根的整数部分XInteger

math haskell static-libraries square-root arbitrary-precision

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

如何在C#项目中使用LIB文件?

有一个lib文件.h,它与一些设备驱动程序一起使用.Visual Studio C++项目示例使用该库作为静态链接.

从该库导出的函数只有2个.

HANDLE open_dev();
HANDLE open_file( char *filename );
Run Code Online (Sandbox Code Playgroud)

我想在我的C#项目中使用该库,并再次静态链接它.怎么可能?

c# c++ static-libraries visual-studio-2010

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

C++库,静态和动态

我正在阅读一篇关于c ++库和静态/动态库和链接的文章.我的问题如下:

1)我们必须编译要插入到库中的文件,然后使用命令ar -crsv创建库文件?(是必须以lib开头并以.a结尾的存档吗?)

2)g ++的命令-I和-L一次使用?向编译器"说"到哪里是库?或者每次编译使用库的源代码?

3)必须使用#include <>包含Libray?如果是的话用什么名字?

我不太了解静态库和静态链接的含义以及动态链接的含义是什么?我所理解的是,使用静态库和链接是指我们将程序与库合并,以便在原始位置不需要原始库?对于Dynamic,我所知道的是代表动态链接库的DDl.那么我能想到的这个DDL的唯一区别是加载到主内存中,但我很困惑

任何有知识的人都可以把我的 - 可能是错的 - 知识变成正确的顺序并解释更多这个术语吗?

谢谢!

c++ dll shared-libraries static-libraries

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

在Xcode中调试静态库

我正在构建一个静态库,但是,当我将它链接到一个演示项目(基本的单一视图应用程序)时,我没有收到任何编译错误.我无法进入从静态库调用的方法来调试它...

我没有收到任何运行时错误,但我认为这是因为它没有被执行,因为我的NSLog没有被显示,并且它没有返回任何东西......

基本上,我如何调试我通过我也创建的演示应用程序创建的静态库..

我该怎么办?我需要帮助!!

提前致谢...

debugging xcode objective-c static-libraries ios

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

如何在Makefile中实现"make install"?

所以这是我正在使用的回购:https://github.com/Garuda1/unixlib

我想知道我编译的lib(unixlib.a)和我的header(unixlib.h)应该在哪里,以便能够使用lib(在Linux-x86或Linux-x86_64下),只需编译:

$ gcc my_source.c -lunixlib
Run Code Online (Sandbox Code Playgroud)

并包括标题my_source.c.

我想我添加这样做Makefile:

install:
    mv $(NAME).a $(LIB_PATH)
    mv unixlib.h $(HEADER_PATH)
Run Code Online (Sandbox Code Playgroud)

但我不知道是什么$(LIB_PATH),并$(HEADER_PATH)有...

c makefile github gnu-make static-libraries

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